#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… будет ли представление работать лучше? Я новичок в этой области!