mysql 連接查詢,一對多只取一條記錄


版本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最小的記錄,以下是我的實際案例,但是這樣查詢有兩個問題

  1. 主表對應的子表記錄display不能重復
  2. 因為使用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 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM