Запрос MySQL: для заданного typeId получение всех записей с их количеством ответов

#mysql #sql #tsql

#mysql #sql #tsql

Вопрос:

У меня есть таблица MySQL с именем entry. В нем есть 2 тестовые записи:

 SELECT * FROM entry WHERE typeId = 2   
  

ВЫБЕРИТЕ * ИЗ записи, ГДЕ typeId = 2

У меня разные типы. Например, когда typeId = 2, это вопрос. Когда typeId = 3, это ответ. Когда ответ вставляется в эту таблицу, столбец LinkId заполняется EntryID вопроса, на который он отвечает.

Например:

 SELECT * FROM entry WHERE typeId = 3
  

ВЫБЕРИТЕ * ИЗ записи, ГДЕ typeId = 3

Как вы можете видеть, обе эти записи имеют typeId = 3, а LinkId обе указывают на EntryID = 1.

В следующем запросе я получаю только вопрос, с которым связаны ответы.

 SELECT SQL_CALC_FOUND_ROWS
entry.entryId, entry.entryText, entry.voteCount AS voteCount,
USER.userName, USER.fbId, COUNT(e2.entryId) AS answerCount
FROM entry
INNER JOIN USER ON entry.userId = USER.userId
INNER JOIN entry AS e2 ON e2.linkId = entry.entryId AND e2.active=1
WHERE entry.active = 1 
AND entry.typeId = 2
ORDER BY entry.voteCount DESC
  

приведенные выше результаты sql statement

Согласно приведенным выше утверждениям, у меня есть 2 записи с typeId = 2. Поэтому мне бы очень хотелось, чтобы это утверждение возвращало обе записи, но, очевидно, что answerCount для записи без каких-либо ответов будет равен 0.

Есть ли у кого-нибудь идеи относительно того, что я вам показал, как исправить этот запрос для получения желаемых результатов?

Обновить:

На основе приведенного ниже предложения. Я изменил внутреннее соединение на левое соединение:

 SELECT SQL_CALC_FOUND_ROWS DISTINCT
entry.entryId, entry.entryText, entry.voteCount AS voteCount,
USER.userName, USER.fbId
FROM entry
INNER JOIN USER ON entry.userId = USER.userId
LEFT JOIN entry AS e2 ON e2.linkId = entry.entryId AND e2.active=1
WHERE entry.active = 1 
AND entry.typeId = 2
ORDER BY entry.voteCount DESC
  

В этом операторе я извлек оператор count (COUNT(e2.EntryID) В КАЧЕСТВЕ answerCount).

Это результат:

SQL Left Join не УЧИТЫВАЕТСЯ

Когда я ввожу оператор COUNT, он возвращает только 1 запись, которая возвращалась, когда это было внутреннее объединение:

с помощью COUNT и INNER JOIN


Обновить:

Я смог заставить строки правильно возвращаться, убедившись, что ЛЕВОЕ СОЕДИНЕНИЕ было правильным, и когда я добавил GROUP BY, строка с 0 ответами вернулась правильно.

введите описание изображения здесь

Смотрите мой запрос ниже.

Ответ №1:

Я думаю, что ваше второе соединение в таблице ввода должно быть левым соединением:

 INNER JOIN entry AS e2 ON e2.linkId = entry.entryId AND e2.active=1
  

должно быть:

 LEFT JOIN entry AS e2 ON e2.linkId = entry.entryId AND e2.active=1
  

Комментарии:

1. Я согласен с @Tudor, попробуйте использовать ЛЕВОЕ соединение, это должно прояснить вашу проблему.

2. и @Jako — я попробовал это и все равно получил те же результаты. Смотрите обновленную информацию.

3. Что, если вы попытаетесь считать по entry.EntryID вместо e2.EntryID?

4. После дальнейшего просмотра я убедился, что мое объединение было правильным, но когда я добавил оператор GROUP BY, я получил результаты, которые искал.

Ответ №2:

Я действительно заставил это работать…

Вот мое обновленное утверждение:

 SELECT  e1.entryId, e1.entryText, e1.voteCount AS voteCount,
USER.userName, USER.fbId, COUNT(e2.linkId)
FROM    entry e1 
INNER JOIN USER ON e1.userId = USER.userId
LEFT JOIN entry e2 
ON  e2.linkId = e1.entryId
WHERE e1.active = 1
AND e1.typeId = 2
GROUP BY e1.entryId
ORDER BY e1.voteCount DESC
  

Я добавил ЛЕВОЕ СОЕДИНЕНИЕ, как было предложено, но я также убедился, что соединение было правильным, и последней частью головоломки была GROUP BY. Как только я ввел это, я получил свои 2 строки, которые я изначально искал.

введите описание изображения здесь

Спасибо за всю помощь!