av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁技術(shù)文章
文章詳情頁

Mysql分組排序取每組第一條的2種實(shí)現(xiàn)方式

瀏覽:483日期:2023-02-18 16:43:30
目錄
  • 前言
  • 前期準(zhǔn)備
  • 第一種
    • 原因分析:
    • 解決:
  • 第二種
    • GROUP_CONCAT函數(shù)解釋:
  • 總結(jié)

    前言

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

    其實(shí)一開始想用的是mybatis的級聯(lián)查詢,結(jié)果說需要一次性全部查出來

    那就沒事了,改sql咯:

    親測實(shí)用

    前期準(zhǔn)備

    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 "產(chǎn)品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="產(chǎn)品圖片表";

    第一種

    這一種也是網(wǎng)上推薦最多的,但個人覺得局限性太大,不介意用在實(shí)戰(zhàn)上

    sql:

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

    問題重點(diǎn):

    • 相信個別同學(xué)復(fù)制過去執(zhí)行就報了this is incompatible with sql_mode=only_full_group_by錯誤
    • 之所有不推薦在實(shí)戰(zhàn)中這樣寫,是因?yàn)槠渲凶硬樵?code>limit 10000已經(jīng)固定寫死了

    原因分析:

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

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

    所以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(字段)函數(shù)包住就能正常運(yùn)行

    有沒有同學(xué)想過為什么需要limit:

    看著極其多余,而且寫死數(shù)量所以導(dǎo)致實(shí)戰(zhàn)不實(shí)用

    那是因?yàn)?/strong>:

    從mysql5.7開始,子查詢的排序已經(jīng)變?yōu)闊o效了。所以要加個limit,這樣子查詢就不光是排序,所以此時排序會生效,但有條數(shù)限制10000

    第二種

    是使用GROUP_CONCAT函數(shù)解決的

    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函數(shù)解釋:

    GROUP_CONCAT函數(shù)用于將GROUP BY產(chǎn)生的同一個分組中的值連接起來,返回一個字符串結(jié)果

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

    語法結(jié)構(gòu):

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

    說明:

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

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

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

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

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

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

    其實(shí)我還是更傾向于級聯(lián)查,不用再重新組裝數(shù)據(jù),代碼也更簡潔

    總結(jié)

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

    標(biāo)簽: MySQL
    主站蜘蛛池模板: 欧美日韩综合 | 99re在线观看视频 | 亚洲性生活视频 | 黄色一集片| 伊人久久精品 | www.日韩av| 久久青草视频 | 久久草av | 国产精品一级 | 黄色片免费在线观看 | 亚洲91在线 | 在线看黄色片 | 免费av网址在线观看 | 久久精品日韩 | 免费在线成人网 | 亚洲精品中文字幕乱码三区91 | 超碰国产在线 | 美女黄色一级片 | 五月天婷婷综合 | 在线观看国产黄色 | 中文字幕+乱码+中文乱码91 | www.日韩在线| 男人添女人囗交图 | 国产免费av在线 | 亚洲精品网址 | 成人久久网站 | 日韩在线看片 | 成人精品免费视频 | 亚洲一级在线 | 国产精品国产三级国产专区52 | 第一福利丝瓜av导航 | 特黄视频| 国产精品自拍小视频 | 亚洲乱码一区二区 | 欧美日韩三区 | 欧美一级黄| 久草福利资源站 | 国产精品自拍小视频 | 午夜亚洲精品 | 久久久精品 | 免费的黄色小视频 |