Возникли проблемы с использованием левых соединений на двух таблицах - PullRequest
1 голос
/ 10 марта 2012

У меня есть три стола. Билеты, история билетов и классификация. Я хотел бы посчитать, сколько билетов было заполнено сотрудниками, но в разбивке по классификации.

Например, сотрудник А работал на 3-х билетах. Первые два билета были классифицированы как ошибки, а последний был особенность. Я хотел бы запросить базу данных и выбрать все заявки, в которых сотрудник изменил состояние заявки.

Примерно так:

Ошибка ..... 2

Особенность ...... 1

UI ..... 0

Запрос ..... 0

Прямо сейчас все, что я могу получить, это:

Ошибка ..... 2

Особенность ...... 1

Используя этот запрос:

SELECT c.id, c.description, count(c.id)
FROM classification c
LEFT JOIN ticket t on t.classification_id = c.id
LEFT JOIN ticket_history th on th.ticket_num = t.id 
WHERE th.employee = '456'
AND th.from_state = '2' AND th.to_state = '3'
GROUP BY c.id
ORDER BY c.id

Я создал SQL Fiddle с примерами данных , но пока не нашел решения.

1 Ответ

3 голосов
/ 10 марта 2012

Первая проблема заключается в том, что выбираются не все строки из таблицы classification, а только те, которые имеют соответствующие записи в двух других таблицах.Это потому, что вы поставили некоторые условия, которые зависят от записей в этих таблицах, в предложении WHERE.По сути, вы делаете LEFT JOIN для решения именно этой проблемы, но подрываете это, помещая условия в WHERE, а не в LEFT JOIN ... ON.

Вторая проблема заключается в том, что вы подсчитываете числоклассификации, а вы на самом деле хотите количество билетов, верно?Поэтому измените count(c.id) на count(t.id), чтобы получить правильные числа.

SELECT c.id, c.description, count(t.id)
FROM classification c
LEFT JOIN ticket t on t.classification_id = c.id
LEFT JOIN ticket_history th on th.ticket_num = t.id
AND th.employee = '456'
AND th.from_state = '2' AND th.to_state = '3'
GROUP BY c.id
ORDER BY c.id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...