SQL количество запросов возвращает то же число - PullRequest
0 голосов
/ 29 мая 2020

Следующий запрос:

Select t1.name
       , t1.email
       , t1.activated 
       , count(t2.id) as 'reporter'
       , count(t3.id) as 'comments'
       , count(t4.id) as 'reported'
from users t1
     inner join tickets as t2 on t1.id = t2.reporter_id
     inner join comments as t3 on t1.id = t3.user_id
     inner join tickets as t4 on t1.id = t4.reported_id
group by name

Счетчики возвращают все 3 одинаковых числа

Ответы [ 2 ]

0 голосов
/ 29 мая 2020

count() возвращает количество строк со значениями, отличными от NULL. id предположительно НЕ NULL, поэтому они возвращают те же значения.

Быстрое и грязное решение вашей проблемы - использовать COUNT(DISTINCT:

Select t1.name, t1.email, t1.activated,
       count(distinct t2.id) as reporter,
       count(distinct t3.id) as comments,
       count(distinct t4.id) as reported
. . . 

Не используйте одинарные кавычки для псевдонимов столбцов! Используйте только одинарные кавычки для строковых констант и констант даты.

Обратите внимание, что ваш запрос никогда не вернет 0 значений ни для одного из счетчиков. Кроме того, это дороже, чем необходимо. Я не предлагаю здесь более эффективного решения, потому что это отвечает на ваш вопрос. Если у вас есть другие проблемы с запросом, задайте новый вопрос с соответствующими образцами данных, желаемыми результатами и объяснением того, что вы хотите сделать.

0 голосов
/ 29 мая 2020

Было бы здорово увидеть образцы данных, текущие результаты и ожидаемые результаты.

Но я предполагаю, что это из-за того, что ваше предложение group by не включает столбцы t1.email и t1.activated.

Select t1.name
       , t1.email
       , t1.activated 
       , count(t2.id) as 'reporter'
       , count(t3.id) as 'comments'
       , count(t4.id) as 'reported'
from users t1
     inner join tickets as t2 on t1.id = t2.reporter_id
     inner join comments as t3 on t1.id = t3.user_id
     inner join tickets as t4 on t1.id = t4.reported_id
group by name
       , t1.email
       , t1.activated 

Без выборочных данных трудно быть уверенным, но я не думаю, что ваши объединения делают то, что вы от них хотите. Вы получите результаты только для пользователей, у которых есть как «сообщенные», так и «репортеры», и эти заявки включают как минимум 1 комментарий от пользователя, который сообщил об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...