MySQL一对多,多对多查询

时间:2017-09-29 04:50:48

标签: mysql sql

我有三张桌子:医院,检查和违规。我需要制定一个查询,每次检查都会在一行中返回所有照明违规,检查日期,检查员注意事项和医院名称。

医院可以进行零次或多次检查。检查可以有零次或多次违规。

这是到目前为止的查询:

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...    |

结果很接近,但在某些情况下,日期不正确。有人可以提出一种方法来实现所需要的吗?

1 个答案:

答案 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_pa​​cket的值。

对于日期,我假设每家医院将进行多次检查以获取您可以使用MAX(i.date)并更改ORDER BY MAX(i.date)的最近检查日期,或者获取可以应用GROUP_CONCAT的所有检查日期我也是