Проблема SQL с правыми соединениями - PullRequest
0 голосов
/ 24 сентября 2019

Следующий запрос SQL делает именно то, что должен, но я не знаю, как его изменить, поэтому он делает то, что мне нужно , чтобы сделать.

SELECT 
    a.id AS comment_id, a.parent_comment_id, a.user_id, a.pid, a.comment, a.blocked_at, a.blocked_by, a.created_at, a.updated_at,
    b.name, b.is_moderator, COUNT(IF(d.type = 1, 1, NULL)) AS a_count, COUNT(IF(d.type = 2, 1, NULL)) AS b_count
FROM 
    comments AS a
RIGHT JOIN 
    users AS b ON b.id = a.user_id
RIGHT JOIN 
    node_user AS c ON c.user = b.id
RIGHT JOIN 
    nodes AS d ON d.id = c.node
WHERE 
    a.pid = 999
GROUP BY
    comment_id
ORDER BY
    a.created_at ASC

Этополучает все комментарии, относящиеся к определенному pid, затем RIGHT JOINS дополнительные пользовательские данные, такие как name и is_moderator, затем RIGHT JOINS любые (так называемые) узлы, включая дополнительные данные, основанные на user id и node id.Как видно из SELECT, я считаю узлы в зависимости от их типа.

Это прекрасно работает для пользователей, у которых есть nodes, подключенные к их учетным записям.Но пользователи, у которых их нет, поэтому чьи id не существуют в таблицах node_user и nodes, не будут отображаться в результатах запроса.

Так что мойвопрос:

Как я могу сделать так, чтобы даже пользователи, у которых нет nodes, все еще отображались в результатах запроса, но с a_count и b_count из 0 или NULL.

1 Ответ

1 голос
/ 24 сентября 2019

Я уверен, что вы хотите левое соединение с, а не правое соединение с.Вы также хотите исправить псевдонимы таблиц, чтобы они имели смысл:

SELECT . . .
FROM comments c LEFT JOIN
     users u
     ON u.id = c.user_id LEFT JOIN
     node_user nu
     ON nu.user = u.id LEFT JOIN
     nodes n
     ON n.id = nu.node
WHERE c.pid = 999
GROUP BY c.id
ORDER BY c.created_at ASC;

Это сохраняет все в таблице first , независимо от того, совпадают или нет строки в последующих таблицах.Похоже, это то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...