0

多くのテーブルを含むものにMySQLを使用したことはありません。必要な情報を取得するために、クエリをネストしました。

postsいくつかのブログとそれに関連するものを出力したいときに私が考えることができる良い例comments

表は次のようになります(質問を短くするために簡略化されています)。

投稿:           id | title | content
コメント:   id | post_id | author | content

comments.post_id明らかに関連するにリンクされている場所post.id

次に、このような投稿とコメントを出力します(通常、クエリをもう少し拡張しますが、質問は短くしたいと思います)。

// Get posts.
$posts = mysql_query("SELECT * FROM posts ORDER BY id DESC");

while($prow = mysql_fetch_assoc($posts))
{
    $pid = $prow["id"];

    // Write post.
    echo '
        <h2 id="post' . $pid . '">' . $prow["title"] . '</h2>
        <p>' . $prow["content"] . '</p>';



    // Get related comments.
    $cquery = mysql_query("SELECT * FROM comments WHERE post_id = '$pid' ORDER BY id DESC");

    while($crow = mysql_fetch_assoc($cquery))
    {
        $cid = $crow["id"];

        // Write comment.
        echo '<p id="comment' . $cid . '"><strong>' . $crow["author"] . ':</strong> ' . $crow["content"] . '</p>';
    }
}

私の知る限り、これは、ブログの投稿が10個ある場合、11個のクエリがあることを意味します(投稿に対して1個、次に各投稿のコメントに対して追加のクエリ)。それは正気ではないようです。

投稿と関連するコメントを1つにまとめて選択するクエリを作成する方法があると確信していますが、それを行う正しい方法がわかりません。結合について漠然と聞いたことがありますが、それらについて読んだとき、それらは私にはあまり意味がありません。

大まかに次のようなものになってしまうといいでしょう。

$query = mysql_query("
    SELECT
        posts.id,
        posts.title,
        posts.content,
        comments.id,
        comments.author,
        comments.content
    FROM
        posts,
        comments
    WHERE
        comments.post_id = post.id,
");

そして、私はこのようなことをすることができます:

while($row = mysql_fetch_assoc($query))
{
    echo '
        <h2 id="post' . $row["posts.id"] . '">' . $row["posts.title"] . '</h2>
        <p>' . $row["posts.content"] . '</p>';

    // Somehow iterate over the comments and display them.
    //
}

きちんと達成したいことを説明したいと思います。

4

1 に答える 1

1

私はあなたの方法がうまくいくと思います(少なくともMS SQLではそうなるでしょう)が、標準的な方法は結合を使用することです:

SELECT
    posts.id AS post_id,
    posts.title,
    posts.content,
    comments.id AS comment_id,
    comments.author,
    comments.content
FROM posts
INNER JOIN comments ON comments.post_id = post.id
ORDER BY post_id, comment_id DESC
于 2012-04-12T00:18:40.070 に答える