mysql 連線查詢,一對多隻取一條記錄

2022-06-25 16:42:11 字數 1326 閱讀 9147

版本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

MySql連表查詢,一對多,按照條件取一對一

現在有乙個需求,就是在原有商品引數的基礎上,增加乙個使用者的支付狀態。然而使用者的支付狀態在訂單表裡面,而且老版本的資料當中,乙個人存在多個訂單。也就是說,乙個商品可能同時對應支付和未支付兩個支付狀態,如果使用者支付了,當然只能已支付的狀態 so.select ins.total score,pay...

一對多查詢

最終會將訂單資訊對映到 orders 中,訂單所對應的訂單明細對映到 orders 中的 orderdetail 屬性中。每個 orders 中的 orderdetail 屬性儲存了該訂單所對應的訂單明細。select orders.user.username user.user.birthday ...

一對多查詢

案例 查詢所有使用者資訊及使用者關聯的訂單資訊。使用者資訊和訂單資訊為一對多關係。sql語句 select u.id,u.username,u.birthday,u.u.address,o.id oid,o.number,o.createtime,o.note from user u left jo...