[英]Need help with complex join
我无法弄清楚这种复杂的连接。
我有3张桌子:
我想将线程ID与帖子thread_id以及用户ID与帖子发帖者和线程发帖者加入。
线程数:
帖子:
使用者:
帮助很大,非常感谢
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.