Как объединить три степени в MySQL

#mysql #join

#mysql #Присоединиться

Вопрос:

У меня есть следующие таблицы:

users(id, name)
posts (id, text, userId)
comments (id, text, userId, postId)

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

 SELECT posts.id, posts.text, users.id, users.name, comments.text AS commentText, commenters.id, commenters.name
FROM posts
    JOIN users
        ON posts.userId = users.id
    LEFT JOIN comments
        ON posts.id = comments.postId 
            LEFT JOIN users AS commenters
                ON comments.userId = users.id
        WHERE posts.id = @postId
  

Проблема с этим запросом заключается в том, что commenters.id и commenters.name столбцы возвращаются пустыми. Есть идеи, где я ошибся?

Комментарии:

1. Есть ли вероятность, что comments.userId заполнен из какого-либо другого источника? Если это реальный внешний ключ, почему вы используете left outer join?

2. @Olaf, он заполняется только из одного источника. Я предполагал, что это должно быть join, но это все еще не работает! :/

3. КСТАТИ: «Это» — это сокращение от «Это есть». Прекратите использовать это там, где вы имеете в виду «его».

4. @olaf, я думаю, это потому, что если я не использую left join, я буду получать сообщения только с комментариями.

5. @Paul Tomblin, для того, кто действительно хорошо говорит по-английски, это одна из моих ужасных привычек. Я часто совершаю эту ошибку, когда пишу в спешке. Спасибо за исправление.

Ответ №1:

Хм, разбейте запрос на части.

Хорошо, сначала небольшая поправка

 SELECT posts.id, posts.text, users.id, users.name, comments.text AS commentText, commenters.id, commenters.name
FROM posts
    JOIN users
        ON posts.userId = users.id
    LEFT JOIN comments
        ON posts.id = comments.postId 
            LEFT JOIN users AS commenters
                ON comments.userId = commenters.id
  

(у вас было users.id , не commenters.id )

во-вторых, если это не исправит проблему, разбейте части запроса на части, чтобы проверить, что выберите * из комментариев, и присоединитесь к пользователям, чтобы проверить, работает ли ссылка на пользователей. Сделайте то же самое для posts .. если это сработает.. дайте мне знать, и мы сможем посмотреть дальше, где что-то идет не так

Комментарии:

1. Спасибо, это было так, и я использую неправильное псевдонимное имя в предложении join («пользователи» вместо «комментаторы»).

2. Также для повышения производительности рассмотрите возможность разделения этого и сохранения его части в виде представления в вашей базе данных.

3. @Mohamad зависит от объема данных, я думаю. Это было просто предложение.

4. @Devraj, мне на самом деле любопытно.. предположим, что он пытался вернуть около 50 строк … из базы данных с более чем 100 000… будет ли представление работать лучше? Я новичок в этой области!