我有三张桌子:医院,检查和违规。我需要制定一个查询,每次检查都会在一行中返回所有照明违规,检查日期,检查员注意事项和医院名称。
医院可以进行零次或多次检查。检查可以有零次或多次违规。
这是到目前为止的查询:
SELECT h.hospital_name AS Name, i.date AS Date, CONCAT_WS(', ', v.notes) AS Notes
FROM hospital_table h
LEFT JOIN inspection_table i ON h.id = i.hospital_id
INNER JOIN violation_table v ON i.id = v.inspection_id
WHERE v.type = 'Lighting'
ORDER BY i.date DESC;
有些情况下,检查会有零次或多次违规。基本上我需要结果看起来像:
| Name | Date | Notes |
----------------------------------------------------------------------
| Burnaby General | 18-09-2107 | Bath light..., bed sconce... |
结果很接近,但在某些情况下,日期不正确。有人可以提出一种方法来实现所需要的吗?
答案 0 :(得分:0)
使用GROUP_CONCAT
代替CONCAT_WS
来获取每个医院的所有笔记。
SELECT h.hospital_name AS `name`,
i.date AS `date`,
GROUP_CONCAT(v.notes) AS Notes
FROM hospital_table h
LEFT JOIN inspection_table i ON h.id = i.hospital_id
LEFT JOIN violation_table v ON i.id = v.inspection_id
WHERE v.type = 'Lighting'
GROUP BY h.hospital_name
ORDER BY i.date DESC;
注意:结果被截断为group_concat_max_len系统变量给出的最大长度,该变量的默认值为1024.尽管返回值的有效最大长度受到约束,但该值可以设置得更高。 max_allowed_packet的值。
对于日期,我假设每家医院将进行多次检查以获取您可以使用MAX(i.date)
并更改ORDER BY MAX(i.date)
的最近检查日期,或者获取可以应用GROUP_CONCAT
的所有检查日期我也是