場景:在數(shù)據(jù)庫中谷丸,當同一個目標有多個值時,需要按序找出其對應最大/最小的那一條鹅龄,或者是按序的第多少條扮休。使用簡單的order by 和 group by無法滿足玷坠,因為mysql是先執(zhí)行group by八堡,后執(zhí)行order by的,這樣先group by就不是想要的排序結(jié)果挂谍。
image.png
解決:可以使用子查詢的limit,然后再查詢子查詢出來的表俺亮。
需要注意一點:
SELECT * FROM
(SELECT * FROM dmall.d_appoint_order ORDER BY order_id DESC) temp
GROUP BY temp. order_id
發(fā)現(xiàn)排序居然沒有生效,頓時很驚訝
explain 查看執(zhí)行計劃铅辞,發(fā)現(xiàn)在沒有 limit 的情況,會少了一個derived 操作,mysql會認為這時候不需要排序,內(nèi)部做了優(yōu)化,所以這種情況下加limit限制就可以了,如下
SELECT * FROM
(SELECT * FROM dmall.d_appoint_order ORDER BY order_id DESC limit 100) temp
GROUP BY temp. order_id
SELECT tmp.id,tmp.appointNo,tmp.orderId FROM (
SELECT
id,
appoint_no AS appointNo,
company_id AS companyId,
order_id AS orderId,
FROM dmall.d_appoint_order
WHERE
appoint_no IN ( "20200618000002", "20200618000003", "20200618000004" )
AND is_sub_order=1
AND order_status=1
AND is_cancel=0
ORDER BY appoint_no ASC ,order_id DESC LIMIT 100
) tmp
GROUP BY tmp.appointNo
image.png