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/

10-09 16:53