假设我的表patients
看起来像这样:
+------------+------------+-----------+----------------+
| id_patient | first_name | last_name | recommended_by |
+------------+------------+-----------+----------------+
| 1 | Joe | Bronson | NULL |
| 2 | Jack | Jackson | 1 |
| 3 | Jon | Jonson | 1 |
+------------+------------+-----------+----------------+
列recommended_by
是一个外键,代表患者表中的另一行。我想计算每位患者给出的建议数量。我使用了这个查询:
SELECT recommended_by, count(recommended_by)
FROM patients
GROUP BY recommended_by;
这给出了这个结果:
+----------------+-----------------------+
| recommended_by | count(recommended_by) |
+----------------+-----------------------+
| NULL | 0 |
| 1 | 2 |
+----------------+-----------------------+
因此它返回一个patient_id并计算其推荐值。但是,我想要包括该患者的名字和姓氏。如何创建查询以返回所有提出建议的患者列表以及他们制作了多少?
例如,上面的结果会返回:
| id_patient | first_name | last_name | recommendations |
+------------+------------+-----------+-----------------+
| 1 | Joe | Bronson | 2 |
答案 0 :(得分:2)
你有一个良好的开端。如果我正在接近这个问题,我会首先编写一个子查询来获取id
列中每个recommended_by
出现的次数。你已经做到了:
SELECT recommended_by, COUNT(*) AS numRecommendations
FROM patients
GROUP BY recommended_by;
然后,您可以在id = recommended_by
的条件下将此子查询与原始查询一起加入。我建议LEFT JOIN
。如果患者从未推荐过某人,您将获得空值。使用COALESCE将其更改为0:
SELECT p.*, COALESCE(t.numRecommendations, 0)
FROM patients p
LEFT JOIN(
SELECT recommended_by, COUNT(*) AS numRecommendations
FROM patients
GROUP BY recommended_by) t ON t.recommended_by = p.id;
修改强>
以下是SQL Fiddle演示。