У меня странный вопрос.У меня есть таблица пользователей, где каждый пользователь имеет уникальный идентификатор пользователя.Пользователи могут оставлять комментарии (подсказки), которые сохраняются в отдельной таблице, каждая строка комментария также имеет уникальный идентификатор, а также содержит идентификатор пользователя, который его опубликовал.Наконец, другие пользователи могут голосовать за комментарии.Голоса хранятся в другой таблице вместе с идентификатором пользователя, за которого проголосовали, и идентификатором комментария за голосующий голос (без уникального идентификатора).
Я рассчитываю рейтинг человека как количество голосов заминус количество голосов «за», так что 4 «вверх» и «2 вниз» приведут к простой оценке 2.Я хочу, чтобы список участников сортировался по рейтингу человека, но у меня возникла небольшая проблема.
Я использую COUNT () и CASE, чтобы определить количество голосов "за" и "против":
(COUNT(CASE WHEN V.vote = 1 THEN 1 ELSE NULL END)-COUNT(CASE WHEN V.vote = 0 THEN 1 ELSE NULL END)) AS 'rating',
Это работает, когда в запрос WHERE я предоставляю один идентификатор пользователя, WHERE user_id = 1. Однако я хочу получить список всех участников и их рейтинги, и вот гдепроблема случается.Мой запрос:
SELECT DISTINCT
U.user_id,
(COUNT(CASE WHEN V.vote = 1 THEN 1 ELSE NULL END)-COUNT(CASE WHEN V.vote = 0 THEN 1 ELSE NULL END)) AS 'rating',
username
FROM users U
LEFT JOIN tips T ON U.user_id = T.user_id
LEFT JOIN votes V ON T.tip_id = V.tip_id
По сути, это должно найти все строки в голосах , где tip_id равен tip_id в таблице tips , затем все строкив таблице tips , где user_id равен user_id в таблице users .У меня проблема в том, что я возвращаю только одну строку, хотя в таблице пользователей 83 строки.В таблице результатов голосования 287 строк, 257 голосов "за" и 30 голосов "против".Эта единственная строка, которую я получаю, имеет рейтинг 227 (то есть 257-30), что означает, что подсчитываются ВСЕ строки в таблице голосов, а не только те, которые указаны для конкретного user_id, который я ищу.Я хочу получить количество голосов «за» и «против», которое получил каждый пользователь за все свои советы.
По сути, для каждого user_id в таблице пользователей он должен найти все подсказки tip_id дляэтот идентификатор пользователя, затем все голосуют за эти tip_id.
Это невозможно, или я упускаю что-то ужасно очевидное?
РЕДАКТИРОВАТЬ: я должен отметить, что если я удалю строку COUNT ()полностью, тогда запрос работает, возвращает правильное количество строк ... он просто не имеет информации для голосования.