##創建表
CREATE TABLE `test_user` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `order_no` BIGINT(20) DEFAULT NULL, `amt` INT(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4
##插入測試數據
INSERT INTO `test_user`(`id`,`order_no`,`amt`) VALUES (1,111,100), (2,222,200), (3,333,300), (4,111,101), (5,111,102), (6,222,201), (7,222,202), (8,333,301), (9,333,302);
##DEMO1:找出最大的金額
SELECT id,order_no,MAX(amt) FROM `test_user` GROUP BY order_no /** 期望結果: "id" "order_no" "max(amt)" "1" "111" "102" "2" "222" "202" "3" "333" "302" **/
##DEMO2:根據每個訂單號找出ID最大的一行記錄
/** 期望結果: "id" "order_no" "amt" "5" "111" "102" "7" "222" "202" "9" "333" "302" **/
##ID最小的這一行,不符合要求,以下5個方法。
SELECT * FROM `test_user` GROUP BY order_no
##簡單方法:倒序然后再分組,可以查詢出來。
SELECT t.* FROM ( SELECT * FROM `test_user` ORDER BY id DESC ) t GROUP BY order_no
##找出最大的這一條記錄數
##方法1 根據ID來關聯
SELECT * FROM `test_user` t WHERE id = (SELECT MAX(id) FROM test_user WHERE order_no = t.order_no);
##方法2 根據中間表的訂單號和max ID來關聯
SELECT t.* FROM `test_user` t, (SELECT order_no,MAX(id) maxId FROM `test_user` GROUP BY order_no) t2 WHERE t.order_no = t2.order_no AND t.id=t2.maxId;
##方法3 NOT EXISTS
SELECT * FROM `test_user` t WHERE NOT EXISTS (SELECT 1 FROM test_user WHERE order_no = t.order_no AND id > t.`id`);
##方法4 根據LEFT JOIN的訂單號和max ID來關聯 (方法2的另外一種表現形式)
SELECT t.* FROM `test_user` t INNER JOIN (SELECT order_no,MAX(id) maxId FROM `test_user` GROUP BY order_no) t2 ON t.order_no = t2.order_no AND t.id=t2.maxId;
##方法5 (方法3的另外一種表現形式) 查詢count為0的情況
SELECT * FROM `test_user` t WHERE 1 > (SELECT COUNT(1) FROM test_user WHERE order_no = t.order_no AND id > t.`id`);