首页 > 解决方案 > 复杂的sql查询 - 无法弄清楚

问题描述

我需要形成连接,以便我拥有所有带有所有注释的票。此外,如果工单有 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;

标签: mysqlsqlgroup-by

解决方案


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

旁注:

  • 在子句中列出所有非聚合列是一个很好的做法(从 MySQL 5.7 开始,默认情况下这是强制性的 - 大多数其他 RDBMS 以相同的方式工作)GROUP BY

  • 不需要别名列,例如t.id as id:默认使用原始列名(当您想要分配不同的名称时需要别名)

  • 我修改了查询以一致地使用表别名


推荐阅读