需要有关复杂连接的帮助

时间:2009-06-23 12:19:02

标签: sql join

我无法弄清楚这个复杂的连接..

我有3张桌子:

我想通过帖子thread_id加入帖子ID,用帖子海报和帖子海报加入用户ID ..

主题:

  • ID int(10)
  • Subject varchar(100)
  • 消息文字
  • 海报int(10)

文章:

  • ID int(10)
  • 海报int(10)
  • 消息文本()
  • Thread_id int(10)

的用户:

  • ID int(10)
  • 用户名varchar(50)

帮助非常感谢

4 个答案:

答案 0 :(得分:4)

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

基本上,如果我理解你的话,你只需要加入用户两次,一次来自帖子,一次来自帖子。

为什么线程和帖子之间有区别?这种建模决策可能会导致一些尴尬,如上所述。

对于这类事情,我倾向于选择adjacency list方法:每个帖子都有一个父级(有人回复的帖子),除非你没有做真正的线程,它只是一个帖子列表,比如一个典型的论坛。

这样线程就是没有父母的帖子。

你正在做的事情可以奏效但是一旦你进入列出用户所做的所有帖子(包括那些开始线程的帖子)之类的事情,这可能会很尴尬。突然你必须一起启动UNIONing表等等。

答案 1 :(得分:2)

怎么样?

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

答案 2 :(得分:0)

这样的事情:

select *
from threads, posts, users
where threads.id = posts.thread_id
and users.ID = threads.poster
and users.ID = posts.poster

答案 3 :(得分:0)

您应该仅使用您真正想要的那些列替换星号列出的列,但我相信这可以达到您想要的效果。

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