2

投稿/記事データとコメントが関連付けられている場合はそれらを返す次のクエリがあります。ただし、投稿に対してコメントが作成されていない場合、(私が思うに) コメント テーブルに結合関係がないため、投稿でさえ何も返されません。コメントがない場合、投稿 ID を持つ行は作成されません。

投稿データと関連するすべてのコメントを 1 つのクエリで取得する方法を誰か説明できますか?

クエリは次のとおりです。

        SELECT * FROM posts
                LEFT OUTER JOIN comments
                ON posts.ID = comments.comment_post_id
            WHERE posts.ID = 8 
                AND posts.post_type = 'post' 
                AND posts.post_status = 'publish'
                AND comments.comment_approved = 1
            ORDER BY comments.comment_date_gmt DESC
4

3 に答える 3

4

あなたが抱えている問題は、テーブルが結合されたままになっている場合でも、where 句でそれによってフィルタリングしていることです。

                AND comments.comment_approved = 1

それを機能させるために、1つのオプションは次のことです。

 SELECT * FROM posts
            LEFT OUTER JOIN comments
            ON posts.ID = comments.comment_post_id
            AND comments.comment_approved = 1
        WHERE posts.ID = 8 
            AND posts.post_type = 'post' 
            AND posts.post_status = 'publish'
        ORDER BY comments.comment_date_gmt DESC

または別の

 SELECT * FROM posts
            LEFT OUTER JOIN comments
            ON posts.ID = comments.comment_post_id
        WHERE posts.ID = 8 
            AND posts.post_type = 'post' 
            AND posts.post_status = 'publish'
            AND (comments.comment_approved IS NULL OR comments.comment_approved = 1)
        ORDER BY comments.comment_date_gmt DESC
于 2013-03-13T13:40:28.403 に答える
2

あなたが持っているのでLEFT OUTER JOIN、左側のテーブルからすべてを取得し、関連する行を右側から取得しますNULL。あなたにはいつである(関連付けられていない)WHERE clauseという述語comments.comment_approved = 1があります。falsecomments.comment_approvedNULL

JOINAND comments.comment_approved = 1条件に移行します。

于 2013-03-13T13:40:14.787 に答える
0

理解することが重要なのは、クエリ プロセッサが外部 (左/右/完全) 結合と where 句に対してどのように機能するかです。

結合ごとに、クエリ プロセッサは結合の結果を含む一時的な結果セット (テーブル) を作成します。結合される新しいテーブルのデータは、現在の一時的な結果セットに含まれるもの、From 句で指定された最初のテーブルのデータ、または直前の結合の結果セット (存在する場合) と結合されます。

Joins ON 句で表現された述語 (条件) に基づいてフィルタリングされたこの結果セット ID は、この構築プロセスの一部として処理されます。もちろん、結合の外側の条件は、そこに行がある場合にのみ適用されます。一致する行が存在しない場合でも、内側からの一致する行が含まれ、外側からのすべての列が null に置き換えられます。

次に、これが重要な部分です。すべての結合が終了し、Where 句に到達すると、結果セットがどのように構築されたか (内部/外部、クロスなど)。したがって、結合の外側にあるテーブルから取得したこの結果セットの列に条件があり、その結合に外側のテーブルからの一致する行がなかったため、NULL が含まれている場合、その行は除外されます。 Where 句の条件によって。

于 2013-03-13T14:03:08.080 に答える