【问题标题】:Getting data from multiple related tables mysql从多个相关表mysql获取数据
【发布时间】:2015-10-08 14:17:24
【问题描述】:

我有一些相关的表格

用户

+----+--------------------------+------------+
| id | email                    | first_name |
+----+--------------------------+------------+
|  2 | Kovacek.Elisha@gmail.com | Loren      |
|  3 | Cale.Beatty@gmail.com    | Fernando   |
|  4 | dKoss@Brown.com          | Evelyn     |
+----+--------------------------+------------+

活动

+----+------------+
| id | name       |
+----+------------+
|  1 | Dolores ve |
|  2 | Harum erro |
|  3 | Ratione qu |
+----+------------+

EVENT_USER(加入)

+---------+----------+
| user_id | event_id |
+---------+----------+
|       1 |        3 |
|       1 |       13 |
|       1 |       48 |
+---------+----------+

以及与用户(消息、连接)等相关的其他表

我想为特定事件的用户获取消息、连接和其他相关数据的计数

我尝试过的 SQL:

SELECT u.`id`, u.`first_name`, u.`last_name`, 
COUNT(m.`id`) as message_count,
COUNT(a.`id`) as article_count
FROM `users` u
LEFT JOIN `event_user` eu ON u.`id` = eu.`user_id`
LEFT JOIN `messages` m ON u.`id` = m.`from`
LEFT JOIN `articles` a ON u.`id` = a.`user_id`
WHERE
eu.`event_id` = 3
GROUP BY u.`id`

但结果显示两列的计数相同。

即所有用户的 message_count 和 article_count 都相同。

【问题讨论】:

  • 您能用所有表格中的一些示例数据创建一个小提琴sqlfiddle.com 吗?

标签: mysql


【解决方案1】:

解决这个问题的最简单方法是使用count(distinct)

SELECT u.`id`, u.`first_name`, u.`last_name`, 
       COUNT(DISTINCT m.`id`) as message_count,
       COUNT(DISTINCT a.`id`) as article_count

如果值很大,那么您可能需要在执行连接之前重写查询以聚合

您获得相同值的原因是count(<column>) 只是计算非空值的数量。因此,您的查询是说所有用户都有消息和文章(如果缺少其中一个,left joins 将产生 NULL 值)。

【讨论】:

  • 这行得通。不过,我正试图围绕这个概念展开思考。
猜你喜欢
  • 2018-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多