亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

前言

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

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

那就沒事了,改sql咯:

親測(cè)實(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 '圖片序號(hào)',
  `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)上推薦最多的,但個(gè)人覺得局限性太大,不介意用在實(shí)戰(zhàn)上

sql:

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

問題重點(diǎn):

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

原因分析:

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

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

所以mysql在5.7.5版本及以上版本就會(huì)報(bào)這個(gè)錯(cuò)誤

解決:

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效了。所以要加個(gè)limit,這樣子查詢就不光是排序,所以此時(shí)排序會(huì)生效,但有條數(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)生的同一個(gè)分組中的值連接起來,返回一個(gè)字符串結(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) 如果需要對(duì)結(jié)果中的值進(jìn)行排序,可以使用ORDER BY子句

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

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

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

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

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

總結(jié)

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

相關(guān)文章

  • linux服務(wù)器下查看mysql的安裝信息

    linux服務(wù)器下查看mysql的安裝信息

    這篇文章主要介紹了linux服務(wù)器下查看mysql的安裝信息,需要的朋友可以參考下
    2017-05-05
  • 基于unique與primary約束的區(qū)別分析

    基于unique與primary約束的區(qū)別分析

    本篇文章介紹了unique與primary約束的區(qū)別分析。需要的朋友參考下
    2013-04-04
  • 一篇文章帶你入門SQL編程

    一篇文章帶你入門SQL編程

    這篇文章主要為大家詳細(xì)介紹了SQL編程的入門方法,使用數(shù)據(jù)庫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • 根據(jù)status信息對(duì)MySQL服務(wù)器進(jìn)行優(yōu)化

    根據(jù)status信息對(duì)MySQL服務(wù)器進(jìn)行優(yōu)化

    網(wǎng)上有很多的文章教怎么配置MySQL服務(wù)器,但考慮到服務(wù)器硬件配置的不同,具體應(yīng)用的差別,那些文章的做法只能作為初步設(shè)置參考,我們需要根據(jù)自己的情況進(jìn)行配置優(yōu)化,好的做法是MySQL服務(wù)器穩(wěn)定運(yùn)行了一段時(shí)間后運(yùn)行,根據(jù)服務(wù)器的”狀態(tài)”進(jìn)行優(yōu)化。
    2011-09-09
  • MySQL v5.7.18 解壓版本安裝詳細(xì)教程

    MySQL v5.7.18 解壓版本安裝詳細(xì)教程

    這篇文章主要介紹了MySQL v5.7.18 解壓版本安裝詳細(xì)教程,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-04-04
  • mysql登錄報(bào)錯(cuò)提示:ERROR 1045 (28000)的解決方法

    mysql登錄報(bào)錯(cuò)提示:ERROR 1045 (28000)的解決方法

    這篇文章主要介紹了mysql登錄報(bào)錯(cuò)提示:ERROR 1045 (28000)的解決方法,詳細(xì)分析了出現(xiàn)MySQL登陸錯(cuò)誤的原因與對(duì)應(yīng)的解決方法,需要的朋友可以參考下
    2016-04-04
  • 詳解MySQL的數(shù)據(jù)行和行溢出機(jī)制

    詳解MySQL的數(shù)據(jù)行和行溢出機(jī)制

    在前面的文章中,白日夢(mèng)曾不止一次的提及到:InnoDB從磁盤中讀取數(shù)據(jù)的最小單位是數(shù)據(jù)頁。 而你想得到的id = xxx的數(shù)據(jù),就是這個(gè)數(shù)據(jù)頁眾多行中的一行。 這篇文章我們就一起來看一下數(shù)據(jù)行設(shè)計(jì)的多么巧妙。
    2020-11-11
  • 深入Mysql字符集設(shè)置分析

    深入Mysql字符集設(shè)置分析

    深入Mysql字符集設(shè)置分析,使用mysql的朋友可以參考下
    2012-03-03
  • MySQL 分組查詢的優(yōu)化方法

    MySQL 分組查詢的優(yōu)化方法

    這篇文章主要介紹了MySQL 分組查詢的優(yōu)化方法,幫助大家更好的理解和學(xué)習(xí)使用MySQL,感興趣的朋友可以了解下
    2021-05-05
  • MySQL安裝配置以及安裝失敗解決過程

    MySQL安裝配置以及安裝失敗解決過程

    我們?cè)谙螺d完MYSQL時(shí),安裝可能會(huì)遇到或大或小的問題,下面這篇文章主要給大家介紹了關(guān)于MySQL安裝配置以及安裝失敗解決的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04

最新評(píng)論