繁体   English   中英

如何使用mysql和php联接3个表?

[英]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按照指示的顺序连接表,而不是允许查​​询优化器确定连接表的最佳顺序。 这就是为什么您可能需要注意查询执行计划的原因。 就查询输出而言, JOINLEFT JOIN之间的主要区别在于: LEFT JOIN结果集将在LEFT JOIN左侧的表的每一行至少包含一行,而常规JOIN将不包含如果连接的右侧没有匹配项,则为行。

编辑:另外,您说“我不希望它显示更改的主题标题,仅显示该主题中所有帖子的原始标题。” 这表明您只需要这些表中的列的子集,在这种情况下SELECT *是不合适的。

暂无
暂无

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

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