[英]How can I join 3 tables with mysql & php?
我有一个页面可以拉用户Post,用户名,xbc / xlk标签等,这是完美的...但是,因为我要从MyBB公告板系统中提取信息,所以完全不同。 答复时,允许人们通过简单地答复和更改来更改“主题”。
我不希望它显示更改后的主题标题,而只是显示该主题中所有帖子的原始标题。
默认情况下,它使用“ RE:thread title”进行复制。 他们可以轻松地对其进行编辑,并且该消息将显示在“主题”单元格中,并且人们不知道该主题发布在哪个线程中,因为他们在回复帖子时将其线程更改为。
所以我只想在他们回复时保留原始主题的标题。
有道理〜??
表:mybb_users字段:uid,用户名
表格:mybb_userfields字段:ufid
表格:mybb_posts字段:pid,tid,replyto,主题,ufid,用户名,uid,消息
表:mybb_threads字段:tid,fid,主题,uid,用户名,lastpost,lastposter,lastposteruid
我尝试了多个查询,但均未成功:
$result = mysql_query("
SELECT * FROM mybb_users
LEFT JOIN (mybb_posts, mybb_userfields, mybb_threads)
ON (
mybb_userfields.ufid=mybb_posts.uid
AND mybb_threads.tid=mybb_posts.tid
AND mybb_users.uid=mybb_userfields.ufid
)
WHERE mybb_posts.fid=42");
$result = mysql_query("
SELECT * FROM mybb_users
LEFT JOIN (mybb_posts, mybb_userfields, mybb_threads)
ON (
mybb_userfields.ufid=mybb_posts.uid
AND mybb_threads.tid=mybb_posts.tid
AND mybb_users.uid=mybb_posts.uid
)
WHERE mybb_threads.fid=42");
$result = mysql_query("
SELECT * FROM mybb_posts
LEFT JOIN (mybb_userfields, mybb_threads)
ON (
mybb_userfields.ufid=mybb_posts.uid
AND mybb_threads.tid=mybb_posts.tid
)
WHERE mybb_posts.fid=42");
您的语法不适用于执行多个LEFT JOIN
。 每个联接都需要自己的ON
子句。
SELECT
*
FROM
mybb_users
LEFT JOIN mybb_userfields ON mybb_users.uid = mybb_userfields.ufid
LEFT JOIN mybb_posts ON mybb_userfields.ufid = mybb_posts.uid
LEFT JOIN mybb_threads ON mybb_posts.tid = mybb_threads.tid
WHERE
mybb_posts.fid = 42
该查询应提供所需的结果。 但这可能不是获得这些结果的最有效查询。 作为测试的一部分,请检查EXPLAIN
的输出,以确保它未使用表扫描或类似方法。
所有这些联接都需要为LEFT JOIN
吗? LEFT JOIN
强制MySQL按照指示的顺序连接表,而不是允许查询优化器确定连接表的最佳顺序。 这就是为什么您可能需要注意查询执行计划的原因。 就查询输出而言, JOIN
和LEFT JOIN
之间的主要区别在于: LEFT JOIN
结果集将在LEFT JOIN
左侧的表的每一行至少包含一行,而常规JOIN
将不包含如果连接的右侧没有匹配项,则为行。
编辑:另外,您说“我不希望它显示更改的主题标题,仅显示该主题中所有帖子的原始标题。” 这表明您只需要这些表中的列的子集,在这种情况下SELECT *
是不合适的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.