0

データベースに次のテーブルがあるとします。

POSTS:
id, title, content

CATEGORIES:
id, name

RELATION:
post_id, cat_id

投稿を公開している間、これらのテーブルに値を挿入することに成功しました。

また、ホームページのすべての投稿の下にカテゴリを表示することもできます。しかし、私が使用している方法は非常にリソースを消費するのではないかと心配しています。

これがMySQL/PHPで私がしていることです。

(コードをスキップして、理解を深めるためにその説明を読むことを選択できます)

//Get all the posts
$database = $connection->prepare("Select * FROM POSTS"); 
$database->execute(array()); 
$result = $database->fetchAll(PDO::FETCH_ASSOC);


foreach ($result as $r) {
        $articleid = $r['id'];

//Display Post title and other things here


//Get the Category Ids
$database = $connection->prepare("Select * FROM RELATION WHERE post_id = ".$article);   
$database->execute(array());
$ret_cat= $database->fetchAll(PDO::FETCH_ASSOC);

//Get names of category, and dislay them
    foreach($ret_cat as $rc)
                {
                    $catid = $rc['cat_id'];
                    $database = $connection->prepare("Select * FROM CATEGORIES WHERE cat_id= ".$catid); 
    $database->execute(array()); 
    $ret_cat_name= $database->fetch(PDO::FETCH_ASSOC);
                    echo "<a href='index.php?category=".$rc['cat_id']."'>".$ret_cat_name['name']."</a> ";
                }
    }//End First ForEach
  1. 表から「必要なすべての投稿」を選択しPOSTSます。
  2. Foreachループを使用して、各投稿を表示します。
  3. foreachループ内で、別のSELECTステートメントを使用して、RELATIONを照合することでテーブルからカテゴリを取得しますPOSTS.id
  4. 次に、別のforeachループを使用して、すべてのカテゴリを表示します。

ただし、RELATIONテーブルにはカテゴリIDしかないため、代わりにカテゴリの名前を表示する必要があります。

  1. そこで、別のSELECTステートメントを使用して、を使用してCATEGORIESテーブルからカテゴリの名前を取得しRELATION.cat_idます。

コードは正常に機能し、必要なものを取得できます。しかし、生成されているmysqlリクエストはたくさんあると思います。したがって、サーバーの負荷が増加します。

ですから、自分がしていることが正しいかどうかを知る必要があります。または、これをすべて行うためのより簡単な方法がある場合はどうなりますか?

4

1 に答える 1

2

JOINを使用して、データベースのラウンドトリップ数を減らしてみませんか?

たとえば、最初に目的の投稿を選択します...

SELECT * FROM POSTS WHERE <some filter criteria for posts>

...そして、返された行ごとに...

SELECT CATEGORIES.*
FROM RELATION JOIN CATEGORIES
    ON RELATION.cat_id = CATEGORIES.id
WHERE
    post_id = <value from the first query>

または、1回の往復ですべてを実行します...

SELECT POSTS.*, cat_id, name
FROM POSTS
    JOIN RELATION
        ON POSTS.id = RELATION.post_id
    JOIN CATEGORIES
        ON RELATION.cat_id = CATEGORIES.id
WHERE
    <some filter criteria for posts>

...この場合、クライアントコードは、同じ。を持つ結果の行を「マージ」する必要がありますPOSTS.id


ところで、あなたはほとんど決して次のようなことをするべきではありません...

Select * FROM POSTS

...WHERE句なし。これは、データベースが大きくなるにつれて拡張されません。

于 2013-03-17T18:43:39.610 に答える