表tickets
{id,subject,appt_id} // appt_id在50%的时间内为空
表ticket_notes
{id,message,tickets_id} //一些
门票没有笔记,有些门票会有很多
表appt
{id,fname,lname,hash} //一些哈希字段为空
我需要形成联接,以便我获得所有带有其所有注释的票证。另外,如果票证具有appt_id,并且如果appt表中的对应行具有哈希,则需要在消息顶部(为每个票证汇总)中显示APPT表中的fname和lname。我的票证和注释之间的连接工作正常(请参阅下文),但是出现了在appt表中添加的其他问题,我不确定如何解决所有票证中均没有appt_id且没有哈希的条件性问题在所有appt行中。
SELECT tickets.id as id, tickets.subject as subject,
group_concat(n.message SEPARATOR '<br><br>') as messages
FROM tickets LEFT JOIN tickets_notes n ON n.`ticket_id` = tickets.`id`
GROUP BY tickets.id;
最佳答案
假设appt
中的一条记录最多对应一个给定的ticket
,则可以再添加一个LEFT JOIN
:
SELECT
t.id,
t.subject,
a.lname,
a.fname,
group_concat(n.message SEPARATOR '<br><br>') as messages
FROM tickets t
LEFT JOIN tickets_notes n ON n.`ticket_id` = t.`id`
LEFT JOIN appt a ON a.id = t.appt_id AND a.hash IS NOT NULL
GROUP BY
t.id,
t.subject,
a.lname,
a.fname
appt
上的连接条件与ticket(appt_id)
上的appt(id)
匹配;还有一个附加条件,即appt(hash)
不应为null
。旁注:
优良作法是在
GROUP BY
子句中列出所有未聚合的列(从MySQL 5.7开始,默认情况下这是强制性的-其他大多数RDBMS的工作方式相同)无需对
t.id as id
之类的列进行别名:默认情况下使用原始列名(要分配其他名称时需要别名)我修改了查询以一致地使用表别名
关于mysql - 复杂的SQL查询-无法解决,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59830917/