mysql连接查询,⼀对多只取⼀条记录
版本1:
场景:消息配置有主表跟⼦表,主表记录消息状态的基本信息,⼦表记录h5消息配置,display(显⽰顺序)、title、url、desc、picurl,其中主表与⼦表是⼀对多的关系,需要⽤⼀条sql查询出显⽰在最前⾯的⼀条消息数据(display最⼩的数据)
以下查询关联关系认为是⽤表id关联的
⼀般取⼀条的⽅法,取id最⼤或最⼩的⼀条记录,⼦表根据分组条件取到最⼩id作为临时表关联查询:
select
from a
left join
mysql删除重复的数据保留一条
(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

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。