国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

Mysql分組排序取每組第一條的2種實現方式

瀏覽:471日期:2023-02-18 16:43:30
目錄
  • 前言
  • 前期準備
  • 第一種
    • 原因分析:
    • 解決:
  • 第二種
    • GROUP_CONCAT函數解釋:
  • 總結

    前言

    記錄一下最近的一個需求,查不同產品排名第一的圖片作為主圖

    其實一開始想用的是mybatis的級聯查詢,結果說需要一次性全部查出來

    那就沒事了,改sql咯:

    親測實用

    前期準備

    MySQL:8.0

    Java:1.8

    建表語句:

    CREATE TABLE `product_image` (  `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT "主鍵id",  `product_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT "產品id",  `sort_id` int NOT NULL COMMENT "圖片序號",  `img_url` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT "圖片路徑",) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT="產品圖片表";

    第一種

    這一種也是網上推薦最多的,但個人覺得局限性太大,不介意用在實戰上

    sql:

    select * from (select * from product_image order by sort_id limit 10000) a group by a.product_id

    問題重點:

    • 相信個別同學復制過去執行就報了this is incompatible with sql_mode=only_full_group_by錯誤
    • 之所有不推薦在實戰中這樣寫,是因為其中子查詢limit 10000已經固定寫死了

    原因分析:

    一、這個錯誤發生在mysql 5.7.5 版本及以上版本會出現的問題:
    mysql 5.7.5版本以上默認的sql配置是:sql_mode=“ONLY_FULL_GROUP_BY”,這個配置嚴格執行了"SQL92標準"。
    很多從5.6升級到5.7時,為了語法兼容,大部分都會選擇調整sql_mode,使其保持跟5.6一致,為了盡量兼容程序。

    二、在sql執行時,出現該原因,簡單來說就是:
    由于開啟了ONLY_FULL_GROUP_BY的設置,如果select 的字段不在 group by 中,
    并且select 的字段未使用聚合函數(SUM,AVG,MAX,MIN等)的話,那么這條sql查詢是被mysql認為非法的,會報錯誤…

    所以mysql在5.7.5版本及以上版本就會報這個錯誤

    解決:

    select ANY_VALUE(id),  product_id, ANY_VALUE(sort_id) from (select * from product_image order by sort_id  limit 100000) a group by a.product_id

    只需要把需要查詢的字段用ANY_VALUE(字段)函數包住就能正常運行

    有沒有同學想過為什么需要limit:

    看著極其多余,而且寫死數量所以導致實戰不實用

    那是因為

    從mysql5.7開始,子查詢的排序已經變為無效了。所以要加個limit,這樣子查詢就不光是排序,所以此時排序會生效,但有條數限制10000

    第二種

    是使用GROUP_CONCAT函數解決的

    sql:

    select group_concat(distinct product_id ORDER BY sort_id), min(id) ,min(img_url)from product_image group by product_id

    GROUP_CONCAT函數解釋:

    GROUP_CONCAT函數用于將GROUP BY產生的同一個分組中的值連接起來,返回一個字符串結果

    GROUP_CONCAT函數首先根據GROUP BY指定的列進行分組,將同一組的列顯示出來,并且用分隔符分隔,由函數參數(字段名)決定要返回的列

    語法結構:

    GROUP_CONCAT([DISTINCT] 要連接的字段 [ORDER BY 排序字段 ASC/DESC] [SEPARATOR "分隔符"])

    說明:

    (1) 使用DISTINCT可以排除重復值

    (2) 如果需要對結果中的值進行排序,可以使用ORDER BY子句

    (3) SEPARATOR '分隔符’是一個字符串值,默認為逗號

    (1) 使用DISTINCT可以排除重復值

    (2) 如果需要對結果中的值進行排序,可以使用ORDER BY子句

    (3) SEPARATOR '分隔符’是一個字符串值,默認為逗號

    其實我還是更傾向于級聯查,不用再重新組裝數據,代碼也更簡潔

    總結

    到此這篇關于Mysql分組排序取每組第一條的2種實現方式的文章就介紹到這了,更多相關Mysql分組排序取每組第一條內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!

    標簽: MySQL
    主站蜘蛛池模板: 精品国产一区二区三区免费看 | 新婚第一次一级毛片 | 99久久这里只精品国产免费 | 免费看三级毛片 | 在线观看的毛片 | 国产黄色三级三级三级 | 免费一级特黄特色黄大任片 | 人成免费a级毛片 | 久久手机免费视频 | 亚洲国产天堂久久综合图区 | 久久精品国产亚洲 | 免费毛片a线观看 | 免费一级欧美大片在线观看 | 国产资源在线免费观看 | 国产成人亚洲精品一区二区在线看 | 国产乱子精品免费视观看片 | 精品国产品国语在线不卡丶 | 成年网在线观看免费观看网址 | 在线综合+亚洲+欧美中文字幕 | 欧美日韩一区二区视频图片 | 国产成人综合日韩精品婷婷九月 | 精品乱人伦一区二区 | 亚洲第一男人天堂 | 日韩国产欧美一区二区三区在线 | 欧美性性性性性色大片免费的 | 国产一区二区精品 | 精品久久一区二区三区 | 末成年娇小性色xxxxx | 神马三级我不卡 | 91在线成人 | 韩国一级淫片视频免费播放 | 一级欧美一级日韩 | 亚洲男人网 | 成年午夜性视频免费播放 | 岛国大片在线播放免费 | 九九精彩视频在线观看视频 | 国产va免费精品高清在线观看 | 欧美视频在线观看免费精品欧美视频 | 日本不卡在线一区二区三区视频 | 国产精品国产三级国产a | 久久国产视频网站 |