1

私は 2 つの別個のテーブルを持っています。最初のテーブルは明らかに投稿されたブログを保持する「ブログ」です。2 番目のテーブルは、ブログに投稿されたすべてのコメントを保持する「b_comments」です。各ブログには一意の ID があり、それに応じて各コメントと共に保存されます。

現在、2 つの個別のクエリを使用して、完全なブログ投稿とそれに付随するすべてのコメントの両方を取得しています。JOINこれら 2 つのテーブルをまとめて、ブログ投稿全体とそれに付随するすべてのコメントを 1 つのクエリで取得する方法はありますか?

JOINMySQL のまたは関数を使用する必要がなかったUNIONので、これが可能かどうかはわかりません。

それが役立つ場合、これが私の2つのクエリです。

$getBlog = $link->query("SELECT * FROM blogs WHERE blog_id = '" .$blogID. "'");

$getComments = $link->query("SELECT * FROM b_comments WHERE blog_id = '".$blogID."' ORDER BY date DESC")

編集:これは、私がやろうとしていることをよりよく理解するのに役立つコードです:

//get blog posts
$blogID = intval($_GET['id']);

$sql = $link->query("SELECT * FROM blogs WHERE blog_id = '" .$blogID. "'");

$row = mysqli_fetch_assoc($sql);

$blogTitle = $link->real_escape_string($row['blog_title']);
$pubDate = $link->real_escape_string($row['pub_date']);
$blogCat = $link->real_escape_string($row['category']);
$blogAuthor = $link->real_escape_string($row['author']);
$blogImage = $link->real_escape_string($row['image']);
$blogContent = $link->real_escape_string($row['content']);


//get comments
$getComments = $link->query("SELECT * FROM b_comments WHERE blog_id = '".$blogID."' ORDER BY date DESC");

if(!($getComments->num_rows > 0)) {

    echo "<div id='commentArea' style='display: none;'>";

    echo "</div>";
} else {                    
    echo "<div id='commentArea'>";  

    while($comRow = mysqli_fetch_assoc($getComments)) {
        $commentID = $link->real_escape_string($comRow['id']);
        $comAuthor = $link->real_escape_string($comRow['user_name']);
        $comDate = $link->real_escape_string($comRow['date']);
            $comContent = $link->real_escape_string($comRow['content']);
        $comDate = date("F jS, Y H:ia", strtotime($comDate));

これらの変数を使用して、データを HTML ページにエコーアウトしています。

4

2 に答える 2

2

テーブル構造を知らなくても、次のようなことを試すことができます。

SELECT *
FROM blogs
JOIN b_comments ON blogs.blog_id = b_comments.blog_id

LEFT JOINコメントのないブログを返したい場合は、 を使用できます。

アップデート

//get blog posts
$blogID = intval($_GET['id']);

$blogTitle = null;
$pubDate = null
$blogCat = null;
$blogAuthor = null;
$blogImage = null;
$blogContent = null;

//get comments
$getComments = $link->query("SELECT a.blog_title, a.pub_date, a.category, a.author, a.image, a.content AS blog_content, b.id, b.user_name, b.date, b.content FROM blogs a JOIN b_comments b ON a.blog_id = b.blog_id WHERE a.blog_id = " . $blogID . " ORDER BY b.date DESC");

if(!($getComments->num_rows > 0)) {
    echo "<div id='commentArea' style='display: none;'>";

    echo "</div>";
} else {
    while($comRow = mysqli_fetch_assoc($getComments)) {
    if(empty($blogTitle)) $blogTitle = $link->real_escape_string($row['blog_title']);
    if(empty($pubDate)) $pubDate = $link->real_escape_string($row['pub_date']);
    if(empty($blogCat)) $blogCat = $link->real_escape_string($row['category']);
    if(empty($blogAuthor)) $blogAuthor = $link->real_escape_string($row['author']);
    if(empty($blogImage)) $blogImage = $link->real_escape_string($row['image']);
    if(empty($blogContent)) $blogContent = $link->real_escape_string($row['blog_content']);

    $commentID = $link->real_escape_string($comRow['id']);
    $comAuthor = $link->real_escape_string($comRow['user_name']);
    $comDate = $link->real_escape_string($comRow['date']);
    $comContent = $link->real_escape_string($comRow['content']);
    $comDate = date("F jS, Y H:ia", strtotime($comDate));
    }
}
于 2013-01-25T01:16:04.003 に答える
0

ブログ投稿とコメントを取得するには、次のLEFT JOINようにします (コメントがない場合はブログ投稿のみ)。

$getBlogAndComments = $link->query("SELECT * FROM blogs b 
                              LEFT JOIN b_comments ON b.blog_id = c.blog_id 
                              WHERE b.blog_id = '" .$blogID. "'");

ただし、この例では、すべてのコメント行と共にブログ投稿を取得するため、2 つのクエリの方が効率的かもしれません。

于 2013-01-25T01:16:57.893 に答える