从多个相关表中获取数据mysql

时间:2015-10-08 14:17:24

标签: mysql

我有一些相关的表格

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都是相同的。

1 个答案:

答案 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个值。