首页 > 解决方案 > SQL - 来自 GROUP BY 的字段列表

问题描述

我必须编写一个 SQL 查询,并且我正在使用以下 SQL 表:

diet (id, name)
id : primary key

patient (id, familyname, firstname)
id : primary key

choice (idpatient, iddiet, optionnal, medical)
idpatient, iddiet : primary key
idpatient : foreign key in ref. to id from patient
idregime : foreign key in ref. to id from diet

医疗 饮食是强制性的(真) 可选的 饮食是愿望(真)

我需要编写一个 SQL 查询来为每个患者选择(id、familyname、firstname)、饮食列表(name),并为每个患者选择医疗或可选。

我已经开始编写这个查询,但我知道 GROUP BY 应该包含 SELECT 中提到的所有字段,也应该在 GROUP BY 中提到。所以我无法从饮食名称或选择(医疗/愿望)中添加字段。

SELECT p.idpatient AS “id”, p.familyname AS “name”, p.firstname AS “firstname”
FROM choice AS c
INNER JOIN diet AS r
ON r.id = c.iddiet
INNER JOIN patient AS p
ON c.idpatient = p.id
GROUP BY p.idpatient, p.familyname, p.firstname
ORDER BY p.familyname, p.firstname

如何使用 GROUP BY 更进一步?也许我不应该使用 GROUP BY 而只使用 JOINS。

对不起,我迷路了。

谢谢你的帮助

标签: sql

解决方案


在 MySQL 和 SQLite 中,可以像这样使用 GROUP_CONCAT()

SELECT p.idpatient AS id,p.familyname AS family_name, p.firstname AS first_name,
GROUP_CONCAT( d.name ) AS diets
FROM  choice AS c
INNER JOIN diet AS d
ON d.id = c.iddiet
INNER JOIN patient AS p
ON c.idpatient = p.id
GROUP BY p.idpatient, p.familyname, p.firstname
ORDER BY p.familyname, p.firstname

这个想法来自如何在一个逗号分隔值中获取列值- 在这里您还可以找到其他 DBMS 产品的示例。

您可以通过在https://sqliteonline.com/上运行以下语句来测试 GROUP_CONCAT() 的行为

INSERT INTO demo (ID,Name,Hint) 
VALUES(21,'SQL Online','Test for GROUP_CONCAT')
SELECT Name,GROUP_CONCAT( hint ) AS hints
FROM  demo 
GROUP BY name

推荐阅读