#mysql #sql #tsql
#mysql #sql #tsql
Вопрос:
У меня есть таблица MySQL с именем entry. В нем есть 2 тестовые записи:
SELECT * FROM entry WHERE typeId = 2
У меня разные типы. Например, когда typeId = 2, это вопрос. Когда typeId = 3, это ответ. Когда ответ вставляется в эту таблицу, столбец LinkId заполняется EntryID вопроса, на который он отвечает.
Например:
SELECT * FROM entry WHERE 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
Согласно приведенным выше утверждениям, у меня есть 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).
Это результат:
Когда я ввожу оператор COUNT, он возвращает только 1 запись, которая возвращалась, когда это было внутреннее объединение:
Обновить:
Я смог заставить строки правильно возвращаться, убедившись, что ЛЕВОЕ СОЕДИНЕНИЕ было правильным, и когда я добавил 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 строки, которые я изначально искал.
Спасибо за всю помощь!