我有一些相关的表格
USERS
+----+--------------------------+------------+
| 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都是相同的。
答案 0 :(得分: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 join
将生成NULL
个值。