Организация вывода данных с помощью MySQL

#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. Я не знаю, сколько там может быть групп — это зависит от проекта.