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 个用于帖子,然后额外查询每个帖子的评论)。这似乎不太正常。

我确信有一种方法可以创建一个查询,它将选择帖子以及相关评论多合一,我只是不知道正确的方法是什么。我隐约听说过联接,但是当我读到它们时,它们对我来说并没有多大意义。

最终得到大致如下的东西会很好:

$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 回答