MySQL запрос прервался после добавления соединения - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть запрос, который загружает данные для цикла в моей CMS для отображения сообщений.В колонках голосования все работало нормально, пока я не присоединился к колонке комментариев.Комментарии отображаются в порядке, но подсчет итогов, голосов и понижения отключен.Дайте мне знать, если вам нужно увидеть таблицы.

SELECT
count(DISTINCT comment.comment ) AS Comment,
idea.dateofcreation AS timestamp, 
idea.userId AS userId,
idea.id AS ID,
idea.text AS Idea,
page.permalink AS Permalink,
user.name AS Username,
COUNT(CASE WHEN votelog.vote !="" THEN 1 END) AS 'totalvotes',
COUNT(CASE WHEN votelog.vote = '1' THEN 1 END) AS 'upvote',
COUNT(CASE WHEN votelog.vote = '-1' THEN 1 END) AS 'downvote'
FROM idea
LEFT JOIN votelog ON idea.id = votelog.ideaid
LEFT JOIN user ON idea.userId = user.id
LEFT JOIN page ON idea.id = page.ideaid
LEFT join comment ON comment.ideaid = idea.id 
GROUP BY idea.id
ORDER BY totalvotes DESC

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Кажется, вы решили присоединиться к таблице comments только для подсчета количества комментариев .

Но теперь вы создаете несколько строк, по одной на комментарийи все остальные отсчеты снимаются.

Я бы предложил использовать скалярный подзапрос для подсчета комментариев и удалить объединение.Что-то вроде:

SELECT
(select count(DISTINCT comment) from comment c where c.ideaid = idea.id) AS Comment,
idea.dateofcreation AS timestamp, 
idea.userId AS userId,
idea.id AS ID,
idea.text AS Idea,
page.permalink AS Permalink,
user.name AS Username,
COUNT(CASE WHEN votelog.vote !="" THEN 1 END) AS 'totalvotes',
COUNT(CASE WHEN votelog.vote = '1' THEN 1 END) AS 'upvote',
COUNT(CASE WHEN votelog.vote = '-1' THEN 1 END) AS 'downvote'
FROM idea
LEFT JOIN votelog ON idea.id = votelog.ideaid
LEFT JOIN user ON idea.userId = user.id
LEFT JOIN page ON idea.id = page.ideaid
GROUP BY idea.id
ORDER BY totalvotes DESC
0 голосов
/ 20 сентября 2018

У вас есть более одного комментария.Итак, агрегирование перед объединением:

SELECT c.num_comments,
       i.dateofcreation AS timestamp, i.userId AS userId, i.id AS ID, i.text AS Idea,
       p.permalink AS Permalink, p.name AS Username,
       SUM( vl.vote <> '' ) AS totalvotes,
       SUM( vl.vote = 1 ) AS upvote,
       SUM( vl.vote = -1 ) AS downvote
FROM idea i LEFT JOIN
     votelog vl
     ON i.id = vl.ideaid LEFT JOIN
     user u
     ON i.userId = u.id LEFT JOIN
     page p
     ON i.id = p.ideaid LEFT JOIN
     (SELECT c.ideaid, COUNT(*) as num_comments
      FROM comment c
      GROUP BY c.ideaid
     ) c
     ON c.ideaid = i.id 
GROUP BY c.num_comments,
       i.dateofcreation i.userId, i.id, i.text,
       p.permalink, p.name
ORDER BY totalvotes DESC;

Примечания:

  • Псевдонимы таблиц облегчают написание и чтение запроса.
  • Это хорошая практика длявключите все неагрегированные столбцы в GROUP BY (и более поздние версии MySQL имеют тенденцию приводить это в исполнение).
  • Я предполагаю, что голоса являются числами.Сравните их с числами, а не со строками.
  • В MySQL есть хороший способ подсчета числа случаев, когда булево выражение истинно.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...