2015-10-23 3 views
2

мне нужен подсчет общего действия идентификатора (звонки, встречи и задачи) группы по имени пользователя и имя AccountsSUM многократный граф и группа по

Я стараюсь, но общее не является правильным

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 таблиц умножило строки и, следовательно, итоговые значения были неверными из-за этого. Использование DISTINCT внутри COUNT() может помочь, например.

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 
; 

Примечание я сменил старый способ соединения через ИНЕК для более современного подхода, вы действительно должны присоединиться.

Другой возможность заключается в том, что ваши счетчики неверны, потому что вы используете ВНУТРЕННИЙ JOINS которые требуют наличия данных в обеих таблицах для возвращаемых строк. Так что, может быть, вам понадобятся некоторые ЛЕВЫЕ ВНЕШНИЕ СОБЫТИЯ.

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 
; 

Окончательный запрос может представлять собой смесь объединений, некоторые INNER и некоторые LEFT.

+0

Спасибо! Это работает! – NARTONIC

+0

Отлично. Какой из них работал? (поэтому, когда другие смотрят на это, они будут знать), и если этот ответ будет правильным, вы не могли бы использовать галочку (галочку), чтобы указать, что это так? –

+0

Натроник дал мне знать, что это была версия 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` 
Смежные вопросы