Вчера я тестировал один запрос в течение нескольких часов и часов, но мне так и не удалось. Эти три таблицы:SQL Присоединиться к трем таблицам
USERS:
#### id: 1 ##### name: Admin ##### Hometown: The Hague
POSTS:
#### id: 1 ##### userid: 1 ##### title: Test I ##### opinion: agree
#### id: 2 ##### userid: 1 ##### title: Nope.. ##### opinion: disagree
REACTIONS:
#### id: 1 ##### userid: 1 ##### opinion: agree
#### id: 2 ##### userid: 1 ##### opinion: disagree
И это то, что я хочу: Я хочу основную информацию о пользователе (имя, родной город, и т.д.), и я хочу, чтобы подсчитать, сколько комплиментов (пост - мнение: согласен), сколько жалоб (пост-мнение: не согласен), сколько положительных реакций (реакция - мнение: согласен) и сколько отрицательных реакций (реакция - мнение: не согласен) этот человек опубликовал.
Это запрос, я использую сейчас:
SELECT
u.name, u.hometown,
SUM(IF(r.opinion="disagree",1,0)) AS agrees
SUM(IF(r.opinion="disagree",1,0)) AS disagrees,
SUM(IF(p.opinion="agree",1,0)) AS compliments,
SUM(IF(p.opinion="disagree",1,0)) AS complaints
FROM
users AS u
LEFT JOIN
reactions AS r
ON
r.userid = u.id
LEFT JOIN
posts AS p
ON
p.userid = u.id
WHERE
u.id = 1
Проблема заключается в том, что это не дает мне правильную информацию. Он возвращает значения, как 8 положительных реакций, хотя в БД есть только две реакции.
Я думаю, что это имеет какое-то отношение к GROUP BY p.id, r.id, но я пробовал это, и это не сработало ... Может ли кто-нибудь просветить меня?
Заранее благодарен!
Что RDBMS? Вам нужно использовать подзапросы, чтобы суммировать реакции пользователя отдельно с сообщениями пользователя, потому что в настоящее время вы перекрестно присоединяетесь к сообщениям и реакциям, что будет означать, что вы получите много дублирования. – GarethD
Кажется, что вы не получили запятую после согласования. – xQbert
Да, я просто набрал это в своем браузере, а не тот код, который я использовал. – Diederik