版本1:
場景:消息配置有主表跟子表,主表記錄消息狀態的基本信息,子表記錄h5消息配置,display(顯示順序)、title、url、desc、picurl,其中主表與子表是一對多的關系,需要用一條sql查詢出顯示在最前面的一條消息數據(display最小的數據)
以下查詢關聯關系認為是用表id關聯的
一般取一條的方法,取id最大或最小的一條記錄,子表根據分組條件取到最小id作為臨時表關聯查詢:
select
from a
left join
(select * from b where id in(select min(id) id from b group by aid) ) x on x.id = a.id
版本2:
當前查詢比較特殊,需要查到display最小的記錄,以下是我的實際案例,但是這樣查詢有兩個問題
- 主表對應的子表記錄display不能重復
- 因為使用inner join,所以如果子表可以為空的話不可以使用該查詢,會導致主表數據也查不出來
SELECT
a.*,
b.id,
b.display
FROM
operational_message_config a
LEFT JOIN operational_message_body b ON b.msg_id = a.id
INNER JOIN ( SELECT min( display ) minDisPlay, msg_id FROM operational_message_body GROUP BY msg_id ) c ON b.msg_id = c.msg_id AND b.display = c.minDisPlay;
版本3
最終版,解決子表為空inner join查詢導致主表數據為空的問題
SELECT
a.*,
b.title, b.description, b.display, b.url, b.picurl
FROM
operational_message_config a
LEFT JOIN ( SELECT min( display ) minDisPlay, tenant_id, msg_id FROM operational_message_body GROUP BY msg_id ) c ON a.id = c.msg_id
LEFT JOIN operational_message_body b ON b.msg_id = a.id AND b.display = c.minDisPlay