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、subject、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 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テーブル スキャンなどを使用していないことを確認します。

これらの結合はすべて s である必要がありLEFT JOINますか? LEFT JOINクエリオプティマイザーがテーブルを結合する最適な順序を決定できるようにするのではなく、MySQL が指定された順序でテーブルを結合するように強制します。そのため、クエリの実行計画に注意する必要がある場合があります。クエリ出力に関するJOINとの主な違いは、結果セットには結合の左側にあるテーブルの各行に対して少なくとも 1 つの行が含まれるのに対し、通常の場合は行が含まれないことです。結合の右側で一致します。LEFT JOINLEFT JOINJOIN

編集:また、「変更された件名を表示したくない、そのスレッドのすべての投稿の元のタイトルだけを表示したくない」と言います。これは、これらのテーブルの列のサブセットのみが必要であることを示唆しており、この場合SELECT *は不適切です。

于 2010-06-19T23:08:43.837 に答える