2014-09-30 108 views
1

我有一个API,我打电话,我需要来自不同表格的数据很多,所以我使用他们的连接,现在的问题是,虽然我有4个回复,5个交互数据总是返回20篇和20间相互作用,这是结果:Sql计数返回错误的数字

screen_name screen_state replies interactions alerts 
sjerd  0   20  20   0 

我使用此查询计数记录和结果:

SELECT u.screen_name, 
      u.screen_state, 
      count(r.id) AS replies, 
      count(i.id) AS interactions, 
      count(a.alerts) AS alerts 
    FROM users u 
    LEFT JOIN reply r ON u.id = r.user 
    LEFT JOIN interactions i ON u.id = i.user_id 
    LEFT JOIN alerts a ON u.id = a.user_id WHERE u.id ='2' 
    GROUP BY u.id, u.screen_state 

有人可以明白为什么它返回20,而我只有7行回复表共有回复表 和5行交互ns在交互表中总共。 每行是1反应或回复。

回答

0
SELECT u.screen_name, u.screen_state, 
    count(DISTINCT r.id) AS replies, 
    count(DISTINCT i.id) AS interactions, 
    count(DISTINCT a.alerts) AS alerts 
    FROM users u 
    LEFT JOIN reply r ON u.id = r.user 
    LEFT JOIN interactions i ON u.id = i.user_id 
    LEFT JOIN alerts a ON u.id = a.user_id WHERE u.id ='2' 
    GROUP BY u.id, u.screen_state 
+0

感谢这并获得成功。你知道为什么它会返回更多的行,然后出现在表中,如果我不添加不同的? – 2014-09-30 10:32:03

+0

You'r欢迎,添加r.id,i.id,a.alerts到您的查询。查看结果集(暂时删除GROUP)。 – 2014-09-30 10:34:58

3

您的计数总是会给出相同的结果,因为所有表都在同一级别加入。

你需要做你算作内的子查询(或什么 - 我永远记得正确的术语):

SELECT u.screen_name, 
     u.screen_state, 
     (select count(*) from reply r where u.id = r.user) AS replies, 
     (select count(*) from interactions i where u.id = i.user_id) AS interactions, 
     (select count(*) from alerts a where u.id = a.user_id) AS alerts 
FROM users u 
WHERE u.id ='2'