繁体   English   中英

在复杂的连接方面需要帮助

[英]Need help with complex join

我无法弄清楚这种复杂的连接。

我有3张桌子:

我想将线程ID与帖子thread_id以及用户ID与帖子发帖者和线程发帖者加入。

线程数:

  • ID int(10)
  • 主题varchar(100)
  • 讯息文字
  • 海报诠释(10)

帖子:

  • ID int(10)
  • 海报诠释(10)
  • 留言文字()
  • Thread_id int(10)

使用者:

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

帮助很大,非常感谢

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

基本上,如果我理解正确,那么您只需要两次加入用户,一次是来自线程,一次是来自帖子。

为什么要区分线程和帖子? 该建模决策可能会导致上述某些尴尬。

对于这种情况,我倾向于使用邻接列表方法:每个帖子都有一个父级(某人答复的帖子),除非您没有进行真正的主题讨论,并且它只是一个帖子列表,例如一个典型的论坛。

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

您正在执行的操作可以工作,但是一旦遇到列出用户所做的所有帖子(包括启动了主题的帖子)之类的事情,它可能会很尴尬。 突然,您必须一起启动UNIONing表,依此类推。

怎么样?

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

像这样:

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

您应该只用您真正想要的列替换星号列出的列,但是我相信这可以满足您的需求。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM