2014-10-23 3 views
0

Я пытаюсь написать sql-запрос, чтобы получить некоторую статистику из bugzilla. Вот запросИспользование count в mysql join

select bugs.bug_id AS bug_id, 
     COUNT(map_pingpong.bug_when) AS re_open, 
     MAX(map_closetime.bug_when) AS closed_date 
    from bugs 
     LEFT JOIN bugs_activity AS map_pingpong 
       ON ((map_pingpong.bug_id = bugs.bug_id 
         and map_pingpong.fieldid=15)) 
     LEFT JOIN bugs_activity AS map_closetime 
       ON ((bugs.bug_id = map_closetime.bug_id 
         and map_closetime.fieldid=8 
         and bugs.bug_status = 'CLOSED')) 
where (bugs.assigned_to = 480) 
GROUP BY bugs.bug_id 
ORDER BY bug_id; 

Таким образом, запрос должен вернуть две вещи

1) Граф событие происходит 2) Дата события происходит

Так что, когда я разбить запрос в два разных запроса возвращают правильные значения. Если я запустил его, как указано выше, значения счетчика неверны (дата правильная, хотя). Я не должен запускать два соединения на одном столе? или счет не должен быть там, когда вы используете соединение?

+1

Вы не можете запустить SQL в фрагменте кода, это только для Javascript. – Barmar

+3

Когда вы запускаете два объединения, вы получаете декартово произведение обеих таблиц, а 'count()' будет считать строки в продукте. – Barmar

+1

Возможно, вам удастся его решить, используя 'COUNT (DISTINCT map_pingpong.some_unique_column)' – Barmar

ответ

0

Как сказал Barmar, вы должны диссоциировать результирующих, чтобы получить правильные числа:

SELECT 
    bugs.bug_id AS bug_id, 
    map_pingpong.cnt AS re_open, 
    map_closetime.mx AS closed_date 
FROM bugs 
    LEFT JOIN (
     SELECT bug_id, COUNT(bug_when) AS cnt 
     FROM bugs_activity 
     WHERE fieldid = 15 
     GROUP BY bug_id 
    ) AS map_pingpong ON map_pingpong.bug_id = bugs.bug_id 
    LEFT JOIN (
     SELECT ba.bug_id, MAX(ba.bug_when) AS mx 
     FROM bugs_activity ba JOIN bugs ON bugs.bug_status = 'CLOSED' AND ba.bug_id = bug.bug_id AND bugs.assigned_to = 480 
     WHERE ba.fieldid = 8 
     GROUP BY ba.bug_id 
    ) AS map_closetime ON bugs.bug_id = map_closetime.bug_id 
WHERE bugs.assigned_to = 480 
GROUP BY bugs.bug_id 
ORDER BY bug_id; 

Как это правильно, функционально говоря, это может быть катастрофой с точки зрения производительности, поэтому будьте осторожны ...

+0

Спасибо, много бармара и семасов. Я понял этот вопрос сейчас. Я предполагал, что счетчик применим только для соответствующего случая JOIN. – user3468877