SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
LIMIT
GROUP BY 先於 ORDER BY 執行。
-- 錯誤預期:想取每組最新記錄
SELECT * FROM article_detail
WHERE userid = 1
GROUP BY userid
ORDER BY update_time DESC;
實際行為:先按 userid 分組(每組僅保留一行,**哪一行是不確定的**),再對這幾行做 ORDER BY。**無法保證取到最新行**。
SELECT
userid,
SUM(click_num) AS total_click,
MAX(update_time) AS latest_update,
COUNT(*) AS total_articles
FROM article_detail
WHERE userid = 1
GROUP BY userid
ORDER BY latest_update DESC;
SELECT * FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY userid ORDER BY update_time DESC) AS rn
FROM article_detail
WHERE userid = 1
) t WHERE rn = 1;
SELECT a.*
FROM article_detail a
JOIN (
SELECT userid, MAX(id) AS max_id
FROM article_detail
WHERE userid = 1
GROUP BY userid
) b ON a.id = b.max_id;
GROUP BY 產生**分組聚合行**,非聚合列取值不確定(除非 ONLY_FULL_GROUP_BY 模式報錯)。ORDER BY 僅對最終結果集排序,**不影響分組內部行序**。