MYSQL GROUP BY 組內排序

需求:顯示最新的3條帖子,(要求同一用戶只取最新一條。)

方法一:先排好序,再group by 達到同一用戶只取最新一條(注意,MYSQL5.7版本的子查詢的排序需要加LIMIT 排序纔有效:引用)

SELECT * FROM 
(
SELECT t1.*, t2.nick_name,t2.head_portrait FROM tb_circle_post t1,tb_user t2 
WHERE t1.user_id = t2.id AND t1.is_delete = 1 
ORDER BY t1.create_time DESC ,t1.likes DESC LIMIT 0,50
)temp
GROUP BY user_id
ORDER BY create_time DESC ,likes DESC LIMIT 0,3 

 方法二:使用DISTINCT的這種寫法莫名其妙地  子查詢的排序生效


SELECT temp.* FROM (
SELECT DISTINCT(t1.user_id),t1.order_amount,t1.create_time,t2.nick_name,t2.head_portrait FROM tb_order_goods t1,tb_user t2 
WHERE t1.user_id = t2.id AND t1.is_delete = 1 
ORDER BY t1.create_time DESC
)temp
GROUP BY temp.user_id
ORDER BY temp.create_time DESC LIMIT 0,3 

 方法三:前兩種方法都有不確定性:就是子查詢的排序是否在最後一層查詢中生效(具體可能需要explain查看執行計劃)

最後的方法我也是覺得最合理的。

先子查詢查出每個用戶發帖子的最新時間,再用這個時間和用戶ID去查多一次帖子表。

SELECT
	t.*
FROM
	(
		SELECT
			user_id,
			max(createTime) AS max_createTime
		FROM
			t
		GROUP BY
			user_id
	) t2
LEFT JOIN t ON t.user_id = t2.user_id
AND t.createTime = t2.max_createTime
ORDER BY
	t2.max_createTime DESC
LIMIT 3

參考:

  1. https://bbs.csdn.net/topics/391946106
  2. https://jingyan.baidu.com/article/4ae03de3df93cc3eff9e6b37.html
  3. https://www.v2ex.com/t/314489
  4. https://blog.csdn.net/fdipzone/article/details/72453553
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章