2015-10-23 86 views
2

我需要总行动ID的计数(电话,会议和任务组)通过用户名和帐户的名称SUM多个计数和集团通过

我试试这个,但总不正确

SELECT count(calls.id) + count(meetings.id) + count(tasks.id) AS 'total', users.user_name AS 'name', GROUP_CONCAT(accounts.name) AS 'accounts' 
FROM accounts, calls, users, meetings, tasks 
WHERE accounts.id = calls.parent_id 
AND calls.assigned_user_id = users.id 
AND accounts.id = meetings.parent_id 
AND meetings.assigned_user_id = users.id 
AND accounts.id = tasks.parent_id 
AND tasks.assigned_user_id = users.id 
GROUP BY name 
+1

您能告诉我们一些样本数据和预期的输出吗? –

+0

GROUP BY名称,accounts.name? – Mihai

+0

总数如何不正确?你能向我们展示样本数据,以及你得到的结果是什么? – mjuarez

回答

1

如果没有代表性数据进行测试的好处,我的猜测是加入的5个表格已将行数相乘,因此总数不正确。在COUNT()中使用DISTINCT可能会有所帮助,例如

SELECT 
     COUNT(DISTINCT calls.id) 
    + COUNT(DISTINCT meetings.id) 
    + COUNT(DISTINCT tasks.id) AS 'total' 
    , users.user_name AS 'name' 
    , GROUP_CONCAT(DISTINCT accounts.name) AS 'accounts' 
FROM accounts 
     INNER JOIN calls ON accounts.id = calls.parent_id 
     INNER JOIN users ON calls.assigned_user_id = users.id 
     INNER JOIN meetings ON accounts.id = meetings.parent_id 
        AND meetings.assigned_user_id = users.id 
     INNER JOIN tasks ON accounts.id = tasks.parent_id 
        AND tasks.assigned_user_id = users.id 
GROUP BY 
     users.user_name 
; 

注意我已经交换过的WHERE子句更现代的方式加盟的老样子,你真的应该加入。

另一种可能性是,你的罪名是不正确的,因为你使用的内部连接这要求两个表中的数据都存在用于返回行的数据。所以也许你需要一些LEFT OUTER JOIN。

SELECT 
     COUNT(DISTINCT calls.id) 
    + COUNT(DISTINCT meetings.id) 
    + COUNT(DISTINCT tasks.id) AS 'total' 
    , users.user_name AS 'name' 
    , GROUP_CONCAT(DISTINCT accounts.name) AS 'accounts' 
FROM accounts 
     LEFT OUTER JOIN calls ON accounts.id = calls.parent_id 
     LEFT OUTER JOIN users ON calls.assigned_user_id = users.id 
     LEFT OUTER JOIN meetings ON accounts.id = meetings.parent_id 
        AND meetings.assigned_user_id = users.id 
     LEFT OUTER JOIN tasks ON accounts.id = tasks.parent_id 
        AND tasks.assigned_user_id = users.id 
GROUP BY 
     users.user_name 
; 

最后的查询可能是一个混合的加入,某种内在的和有些人离开。

+0

谢谢!其作品! – NARTONIC

+0

太好了。哪一个工作? (所以当别人看这个时,他们会知道),如果这个答案是正确的,你会介意使用勾号来表示它是? –

+0

Natronic让我知道这是上面看到的LEFT JOIN版本。 –

0
`SELECT COUNT(calls.id) + COUNT(meetings.id) + COUNT(tasks.id) AS total, GROUP_CONCAT(users.user_name) AS name, GROUP_CONCAT(accounts.name) AS accounts 
FROM accounts JOIN calls ON (accounts.id = calls.parent_id) 
JOIN users ON (calls.assigned_user_id = users.id) 
JOIN meetings ON (meetings.assigned_user_id = users.id) 
JOIN tasks ON (accounts.id = tasks.parent_id and tasks.assigned_user_id = users.id) 
GROUP BY users.user_name, accounts.name`