Нужна помощь со сложным соединением - PullRequest
1 голос
/ 23 июня 2009

Я не могу понять это сложное соединение ..

У меня есть 3 таблицы:

Я хочу присоединиться к идентификатору темы с постами thread_id и идентификатору пользователя с постом постера и постером темы ..

Тема:

  • ID int (10)
  • Тема varchar (100)
  • Текст сообщения
  • Плакат int (10)

Сообщения:

  • ID int (10)
  • Poster int (10)
  • Текст сообщения ()
  • Thread_id int (10)

Пользователи:

  • ID int (10)
  • имя пользователя varchar (50)

Помощь очень полезна, высоко ценится

Ответы [ 4 ]

4 голосов
/ 23 июня 2009
SELECT /* whatever */
FROM threads t
JOIN users tu ON t.poster = tu.id
JOIN posts p ON t.id = p.thread_id
JOIN users pu ON p.poster = u.id

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

Почему различие между темами и сообщениями кстати? Это модельное решение может привести к некоторой неловкости, подобной приведенной выше.

Для такого рода вещей я предпочитаю подход список смежности : у каждого поста есть родитель (пост, на который кто-то ответил), если только вы не выполняете настоящую ветку, а это просто список посты, как на типичном форуме.

Таким образом, темы - это просто сообщения, у которых нет родителей.

То, что вы делаете, может работать, но это может быть неудобно, когда вы попадаете в список, включающий перечисление всех сообщений (включая те, которые создали тему), которые сделал пользователь. Внезапно вы должны начать объединять столы вместе и так далее.

2 голосов
/ 23 июня 2009

Как насчет?

select 
    Threads.*, 
    Posts.*, 
    Thread_poster.*, 
    Post_poster.* 
from 
   Threads inner join Posts on Threads.ID = Posts.Thread_id
           inner join Users as Thread_poster on Threads.Poster = Thread_poster.ID
           inner join Users as Post_poster on Posts.Poster = Post_poster.ID
0 голосов
/ 23 июня 2009

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

select u.*, p.*, t.*
from users u inner join threads t on u.ID = t.Poster
     inner join posts p on t.Poster = p.Poster and t.ID = p.Thread_id
0 голосов
/ 23 июня 2009

Примерно так:

select *
from threads, posts, users
where threads.id = posts.thread_id
and users.ID = threads.poster
and users.ID = posts.poster
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...