【问题标题】:Count the occurrences of a foreign key that references a primary key in the same table计算引用同一表中主键的外键的出现次数
【发布时间】:2015-01-03 01:05:38
【问题描述】:

假设我有如下表 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 |
+----------------+-----------------------+

因此它返回一个患者 ID 和它的推荐计数。但是,我想包括该患者的名字和姓氏。如何创建查询以返回提出建议的所有患者的列表以及他们提出的数量?

例如上面的结果会返回:

| id_patient | first_name | last_name | recommendations |
+------------+------------+-----------+-----------------+
|          1 | Joe        | Bronson   |               2 |

【问题讨论】:

  • 每个推荐用逗号分隔?
  • 这个问题能再清楚一点吗?
  • 好的,你不明白哪一部分?
  • “我如何使用推荐的值从我的患者表中提取名字和姓氏?” – 使用子查询或 JOIN。
  • 如果我要问这样的问题,我会根据提供的数据集提供所需结果的示例。

标签: mysql sql count


【解决方案1】:

你有一个好的开始。如果我正在解决这个问题,我会首先编写一个子查询来获取每个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 演示。

【讨论】:

  • 没问题。如果您不想看到从未推荐过的患者,只需删除coalesce 并使其成为内部连接,您将只会看到提出过推荐的患者。 @BranislavLazic
  • 我看不到子查询在这里为我们做了什么。
  • @Strawberry 子查询获取每个 patient_id 提出的建议计数。然后,它与原始表连接起来以获取其他值。如果这有助于演示解决方案,我已经添加了一个 SQL Fiddle。
  • 但是你不需要它是一个子查询——没有它(我认为)它会更好地工作......sqlfiddle.com/#!2/a8af3f/11
  • @Strawberry 你是对的。在具有 1000 个随机行的 MySQL 工作台中进行了测试,它在大约一半的时间内执行。不过,这两个查询都不慢。我会发布你自己的答案。如果没有,我至少会编辑我的以分享替代方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-11
相关资源
最近更新 更多