SQL: присоединиться к родительским и дочерним таблицам

Я создаю простое веб-приложение для обзора, и мне нужна помощь с SQL Query.

Есть 3 таблицы (Темы, Комментарии, Пользователи). Мне нужен SQL-запрос для выбора данных из всех трех таблиц.

Таблица «Темы» является родительской, а таблица «Комментарии» содержит дочерние записи (от нуля до 100 записей на родительскую.

Третья таблица «Пользователи» содержит информацию обо всех пользователях.

Вот поля для 3 таблиц:

Topics (topicID, strTopic, userID)
Comments (commentID, topicID, strComment, userID)
Users (userID, userName)

Я старался:

SELECT * 
FROM   Topics 
  Inner Join Comments ON Topics.topicID = Comments.topicID
  Inner Join Users ON Topics.userID = Users.userID

Но это не работает правильно, потому что существует несколько тем, а информация о пользователе не присоединена к таблице комментариев. Любая помощь будет оценена по достоинству.


person pray4Mojo    schedule 09.07.2012    source источник
comment
Вы хотите, чтобы результаты включали темы, которые не имеют комментариев?   -  person HABO    schedule 10.07.2012
comment
Что вы пытаетесь достичь? Вы хотите найти всю активность пользователя? Все комментарии, сделанные по определенной теме, включая имена пользователей? Кроме того, обычно не рекомендуется использовать префикс/суффикс имени столбца с типом переменной (поэтому не используйте str...). Вы также можете извлечь выгоду из прикрепления временных меток к своим таблицам по ряду причин.   -  person Clockwork-Muse    schedule 10.07.2012
comment
Результатом должен быть список всех тем конкретных пользователей с каждым комментарием (если таковой имеется) под этой темой. Схема БД в моем примере была упрощена для краткости, есть метки времени как для тем, так и для комментариев, а также для других полей. Я не уверен, как это можно сделать, повторяя один набор записей.   -  person pray4Mojo    schedule 10.07.2012


Ответы (2)


Вы должны сделать левое соединение с комментарием, чтобы получить темы без комментариев, а также присоединиться к теме и комментарию с пользователями, чтобы получить соответствующую информацию о пользователях для обоих.

SELECT * 
FROM Topics t
INNER JOIN Users tu on tu.userID = t.userID
LEFT JOIN Comments c on c.topicID = t.topicID
LEFT JOIN User cu on cu.userID = c.userID
person Satish    schedule 09.07.2012
comment
Это работает, за исключением того, что при отсутствии комментариев в запросе отсутствуют некоторые данные из таблицы тем. - person pray4Mojo; 11.07.2012
comment
На самом деле это не отсутствующие данные, а возвращаемый идентификатор пользователя — это идентификатор пользователя из таблицы тем, даже если есть запись комментария. - person pray4Mojo; 11.07.2012
comment
Этого не должно быть. Возможно, userId темы и userId комментария совпадают, поэтому он дважды возвращает одно и то же. - person Satish; 11.07.2012
comment
В этом была проблема. Я добавил псевдоним для поля, и все работает нормально. - person pray4Mojo; 12.07.2012

Вам нужно присоединиться к пользовательской таблице дважды.

SELECT *
FROM Topics
 INNER JOIN Comments ON Topics.topicID = Comments.topicID
 INNER JOIN Users AS u1 ON Topics.userID = u1.userID
 INNER JOIN Users AS u2 ON Comments.userID = u2.userID
person Levi W    schedule 09.07.2012