#mysql
#mysql
Вопрос:
У меня есть следующая таблица с данными:
t1 (results): card_id group_id project_id user_id
Таблицы, содержащие фактические метки, являются:
t2 (groups): id project_id label
t3 (cards): id project_id label
Может быть несколько записей от разных пользователей.
Мне нужна помощь в написании запроса для отображения результатов в табличном формате с итоговыми значениями соответствующей карточки / группы. Вот мое начало, но я не уверен, что я на правильном пути…
SELECT COUNT(card_id) AS cTotal, COUNT(group_id) AS gTotal
WHERE project_id = $projID
Ответ №1:
Если я не ошибаюсь, кажется, что все, что вам нужно сделать, это сгруппировать по идентификатору card_id и group_id для данного project_id и вывести количество для каждой группы
SELECT card_id, group_id, COUNT(user_id) FROM mytable
WHERE project_id = 001
GROUP BY (card_id, group_id);
Редактировать:
Учет таблиц card и group требует некоторых объединений, но запрос в основном тот же. Все еще группируется по карточке и группе и ограничивается идентификатором проекта
SELECT c.label, g.label, COUNT(t1.user_id) FROM mytable t1
JOIN groups g ON t1.group_id=g.id
JOIN cards c ON t1.card_is=c.id
WHERE t1.project_id = 001
GROUP BY (c.card_id, g.group_id)
ORDER BY (c.card_id, g.group_id);
Я не думаю, что вы можете получить таблицу такой, какой хотите, используя только SQL. Вам нужно будет отобразить таблицу в коде, выполнив итерацию по результатам. Как вы это делаете, зависит от того, какой язык / платформу вы используете.
Комментарии:
1. К сожалению, в моем первоначальном сообщении были опущены метки групп и карточек. Я обновил свой пост.
2. @santa: ОБЪЕДИНЕНИЕ по ЛЕВОМУ КРАЮ необязательно, если вы не хотите включать строки для идентификаторов card_id, которые больше не существуют в таблице cards, или столбцы для идентификаторов group_id, которые больше не существуют в таблице groups. Если вы хотите игнорировать карточки, которые были удалены из таблицы cards, вам не нужно ЛЕВОЕ СОЕДИНЕНИЕ
Ответ №2:
если вы точно знаете, что существует девять групп, то просто включите эти группы в подзапросы — аналогично этому:
select cTotal, g1.gTotal as Group1, g2.gTotal as Group2... etc
from
( SELECT COUNT(card_id) AS cTotal
, COUNT(group_id) AS gTotal
WHERE project_id = $projID
AND group_id = 1 ) g1
, ( SELECT COUNT(card_id) AS cTotal
, COUNT(group_id) AS gTotal
WHERE project_id = $projID
AND group_id = 2 ) g2
etc.
Комментарии:
1. Я не знаю, сколько там может быть групп — это зависит от проекта.