计算引用同一表中主键的外键的出现次数

时间:2015-01-02 16:28:42

标签: mysql sql count

假设我的表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 |

1 个答案:

答案 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演示。