最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2023年02月15日 10:08:52   作者:她與月色長留  
開發(fā)中經(jīng)常會遇到,分組查詢最新數(shù)據(jù)的問題,下面這篇文章主要給大家介紹了關(guān)于Mysql分組排序取每組第一條的2種實現(xiàn)方式,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

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

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

那就沒事了,改sql咯:

親測實用

前期準(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)上推薦最多的,但個人覺得局限性太大,不介意用在實戰(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錯誤
  • 之所有不推薦在實戰(zhàn)中這樣寫,是因為其中子查詢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)致實戰(zhàn)不實用

那是因為

從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)為逗號

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

總結(jié)

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

相關(guān)文章

  • mysql 8.0.17 安裝配置方法圖文教程

    mysql 8.0.17 安裝配置方法圖文教程

    這篇文章主要為大家詳細(xì)介紹了mysql 8.0.17 安裝配置方法圖文教程,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Linux centos7環(huán)境下MySQL安裝教程

    Linux centos7環(huán)境下MySQL安裝教程

    這篇文章主要為大家詳細(xì)介紹了Linux centos7環(huán)境下MySQL安裝教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • MySQL Semisynchronous Replication介紹

    MySQL Semisynchronous Replication介紹

    這篇文章主要介紹了MySQL Semisynchronous Replication介紹,本文講解了Semisynchronous Replication 定義、,需要的朋友可以參考下
    2015-05-05
  • MySQL MEM_ROOT詳解及實例代碼

    MySQL MEM_ROOT詳解及實例代碼

    mysql中使用MEM_ROOT來做內(nèi)存分配的部分,這篇文章會詳細(xì)解說MySQL中使用非常廣泛的MEM_ROOT的結(jié)構(gòu)體,同時省去debug部分的信息,僅分析正常情況下。需要的朋友可以參考一下
    2016-11-11
  • MySQL實現(xiàn)每天定時12點(diǎn)彈出黑窗口

    MySQL實現(xiàn)每天定時12點(diǎn)彈出黑窗口

    這篇文章主要介紹了MySQL實現(xiàn)每天定時12點(diǎn)彈出黑窗口問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • MySQL如何將一個表的字段更新到另一個表中

    MySQL如何將一個表的字段更新到另一個表中

    在數(shù)據(jù)庫管理中,經(jīng)常需要將一個表中的數(shù)據(jù)更新到另一個表中,本文將通過幾個簡單示例為大家詳細(xì)介紹如何在MySQL中實現(xiàn)這一功能,有需要的可以參考下
    2025-01-01
  • mysql5.7.18安裝時提示無法找到入口問題的解決方法

    mysql5.7.18安裝時提示無法找到入口問題的解決方法

    這篇文章主要為大家詳細(xì)介紹了mysql5.7.18安裝時出現(xiàn)無法找到入口問題的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • 淺談MyISAM 和 InnoDB 的區(qū)別與優(yōu)化

    淺談MyISAM 和 InnoDB 的區(qū)別與優(yōu)化

    InnoDB和MyISAM是在使用MySQL最常用的兩個表類型,各有優(yōu)缺點(diǎn),視具體應(yīng)用而定。下面我們就來具體探討下吧
    2015-07-07
  • MySQL 在創(chuàng)建和刪除用戶時出現(xiàn)的ERROR 1396 (HY000)錯誤問題解決

    MySQL 在創(chuàng)建和刪除用戶時出現(xiàn)的ERROR 1396 (HY000)錯誤問題解決

    MySQL作為流行的數(shù)據(jù)庫系統(tǒng),涉及用戶管理時可能遇到ERROR1396錯誤,該錯誤發(fā)生在嘗試創(chuàng)建已存在的用戶或刪除不存在的用戶時,解決方法包括檢查用戶存在性或選擇不同用戶名,此外,MySQL提供了創(chuàng)建和授權(quán)用戶的便捷工具,注意使用FLUSH PRIVILEGES命令使授權(quán)生效
    2024-09-09
  • MySQL中使用binlog時格式該如何選擇

    MySQL中使用binlog時格式該如何選擇

    這篇文章主要給大家介紹了關(guān)于MySQL中使用binlog時格式該如何選擇的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11

最新評論

策勒县| 扬州市| 通海县| 秦安县| 兴安县| 阿城市| 新龙县| 柞水县| 兴义市| 昭平县| 丹凤县| 锦州市| 敦煌市| 花莲市| 曲阜市| 铜川市| 芦山县| 镇原县| 河北省| 平阴县| 修武县| 博爱县| 兴隆县| 浦城县| 阿拉善右旗| 河池市| 交城县| 迁安市| 民乐县| 巩义市| 永吉县| 乌鲁木齐市| 西贡区| 桂阳县| 衡水市| 涪陵区| 阜平县| 花莲县| 砀山县| 张家川| 措勤县|