0

我有一个页面可以吸引用户发布、用户名、xbc/xlk 标签等,这是完美的……但是因为我从 MyBB 公告板系统中提取信息,所以它完全不同。回复时,允许人们通过简单的回复和更改来更改“主题主题”。

我不希望它显示更改的主题标题,只是该线程中所有帖子的原始标题。

默认情况下,它使用“RE:thread title”回复。他们可以轻松地编辑它,它会显示在“主题”单元格中,人们不会知道它发布在哪个线程中,因为他们在回复帖子时将线程更改为。

所以我只想在他们回复时保留原始线程标题。

有道理~??

表:mybb_users 字段:uid,用户名

表:mybb_userfields 字段:ufid

表:mybb_posts 字段:pid,tid,replyto,subject,ufid,username,uid,message

表: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");
4

1 回答 1

2

您的语法不适合执行多个LEFT JOINs. 每个连接都需要自己的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 JOINs 吗?LEFT JOIN强制 MySQL 以指定的顺序连接表,而不是允许查​​询优化器确定连接它们的最佳顺序。这就是为什么您可能需要小心查询执行计划的原因。就查询输出而言,两者之间的主要区别在于JOIN,对于连接左侧的表的每一行,结果集将至少包含一行,而如果没有,则常规将不包含一行连接右侧的匹配项。LEFT JOINLEFT JOINJOIN

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

于 2010-06-19T23:08:43.837 回答