Вот мой SQL-запрос:
SELECT
COUNT(CASE WHEN 'urgency'='1' THEN 1 END) AS verylow,
COUNT(CASE WHEN 'urgency'='2' THEN 1 END) AS low,
COUNT(CASE WHEN 'urgency'='3' THEN 1 END) AS standard,
COUNT(CASE WHEN 'urgency'='4' THEN 1 END) AS high,
COUNT(CASE WHEN 'urgency'='5' THEN 1 END) AS critical,
tbl_users.userName
FROM
notes, tbl_users
WHERE
notes.responsible = tbl_users.userID
AND project_id = '4413'
AND (notes.status = 'Ongoing' OR notes.status = 'Not started')
и выход:
verylow low standard high critical userName
5 1 2 1 1 Nick
Однако это неправильно, потому что у меня есть несколько пользователей в базе данных, которые назначили задачи. и это выглядит так в моей базе данных:
urgency userName
3 Nick
5 Nick
4 Nick
3 James
1 James
1 Nick
2 Nick
1 James
1 Nick
1 Nick
Любая идея, почему она не учитывает актуальность для другого пользователя и сколько у него разных сроков?
То, что вы делаете, не совсем правильно. Если вы включите режим MySQL ONLY_FULL_GROUP_BY, вы получите предупреждение, потому что вы выбираете столбец, который не находится в предложении GROUP BY
без применения функции агрегации. Поэтому вам нужно предложение GROUP BY
.
Весь запрос должен выглядеть так:
SELECT
COUNT(CASE WHEN 'urgency'='1' THEN 1 END) AS verylow,
COUNT(CASE WHEN 'urgency'='2' THEN 1 END) AS low,
COUNT(CASE WHEN 'urgency'='3' THEN 1 END) AS standard,
COUNT(CASE WHEN 'urgency'='4' THEN 1 END) AS high,
COUNT(CASE WHEN 'urgency'='5' THEN 1 END) AS critical,
tbl_users.userName
FROM
notes, tbl_users
WHERE
notes.responsible = tbl_users.userID
AND project_id = '4413'
AND (notes.status = 'Ongoing' OR notes.status = 'Not started')
GROUP BY tbl_users.userName;
С помощью COUNT
вы объединяете свои строки. Поскольку не существует предложения GROUP BY
, вы объединяете их в одну строку (а не, скажем, строку на пользователя).
Вы выбираете userName
. Который? Когда вы выбираете только одну строку, СУБД выбирает один произвольно.