mysql - 复杂的sql查询 - 无法弄清楚
问题描述
- Table
tickets
{id, subject, appt_id} //appt_id 50% 的时间是空的 - Table
ticket_notes
{id, message, Tickets_id} //有些票没有备注,有些票有很多 - Table
appt
{id, fname, lname, hash} //部分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
。
旁注:
在子句中列出所有非聚合列是一个很好的做法(从 MySQL 5.7 开始,默认情况下这是强制性的 - 大多数其他 RDBMS 以相同的方式工作)
GROUP BY
不需要别名列,例如
t.id as id
:默认使用原始列名(当您想要分配不同的名称时需要别名)我修改了查询以一致地使用表别名
推荐阅读
- c - 程序不输出任何东西
- c - 处理内核中未定义的指令
- java - Spinner 如何更改数据
- javascript - Context.Provider 和 Context.Consumer 和 JavaScript 中的 document.querySelector() 一样吗?
- ruby - 用于链接到文件中部分的内容的 Serverspec 测试语句
- ios - 如何删除 iTunes Connect TestFlight “Beta App Review Information”以允许应用转移
- excel - 允许 Power Query 同时包含文本和数字
- mysql - 更新或创建条件数据作为输入
- excel-formula - 用于提取字符串末尾带有多个右括号的文本的 Excel 公式
- powershell - 使用 Powershell 创建应用服务或插槽