mysql中group by和order by同時使用無效的替代方案


前言

最近一年由於工作需要大部分使用的都是NoSql數據庫,對關系型數據庫感覺越來越陌生,一個由group byorder by 引發的血案由此而生。在此做個記錄,以備不時之需。

需求(得到所有barCode的最新的一條數據)

首先,看一下整體的表結構。
表結構
現在查找每個barCode中最新的數據。

由於數據太多,不是很好看到效果。我們就拿一個barCode4565789的數據做示例。

SELECT
	barCode,
	priCommodityID,
	createDate
FROM
	tb_history_version
WHERE
	barCode = '4565789'
ORDER BY
	createDate DESC;

示例數據

試錯

由於很久沒有寫過sql了。所以首先想到了用 group by和order by組合查詢。

SELECT
	barCode,
	priCommodityID,
	createDate
FROM
	tb_history_version
WHERE
	barCode = '4565789'
GROUP BY
	barCode
ORDER BY
	createDate DESC;

結果如下:
錯誤結果:1
可以看到這並不是我們想要的結果,order by沒有任何效果。
接下來就試一下運用子查詢的方式將兩者結合。先排序再分組

SELECT
	*
FROM
	(
		SELECT
			barCode,
			priCommodityID,
			createDate
		FROM
			tb_history_version
		WHERE
			barCode = '4565789'
		ORDER BY
			createDate DESC
	) AS A
GROUP BY
	A.barCode;

結果還是令人失望的
錯誤結果:2

解決

上面兩種方式試過了,雖然結果讓人傷心,但是工作還是要繼續。於是就網上找各種資料,看能否用其他方式解決問題。偶然間看到了group_concat可以實現分組排序,就拿來試一試

SELECT
	barCode,
	GROUP_CONCAT(
		priCommodityID
		ORDER BY
			createDate DESC
	) AS priCommodityID,
	GROUP_CONCAT(
		createDate
		ORDER BY
			createDate DESC
	) AS createDate
FROM
	tb_history_version
WHERE
	barCode = '4565789';

結果如下
結果一
可以看到順序沒問題了,但是所有數據都被拼接在一起了。需要進一步做截取字符的處理

SELECT
	barCode,
	SUBSTRING_INDEX(
		group_concat(
			priCommodityID
			ORDER BY
				createDate DESC
		),
		',',
		1
	) AS priCommodityID,
	SUBSTRING_INDEX(
		group_concat(
			createDate
			ORDER BY
				createDate DESC
		),
		',',
		1
	) AS createDate
FROM
	tb_history_version
WHERE
	barCode = '4565789'
GROUP BY
	barCode;

正確結果
ok!到這里就發現已經實現我們剛開始的需求了。

總結

group byorder by同時使用是沒有效果的,可以使用group_concatgroub by替代。group_concat內可以實現字段排序。

參考文章

http://www.cnblogs.com/jjcc/p/5896588.html

首發地址

http://www.devzxd.top/2017/05/27/mysql-groupby-orderby.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM