5

私はMySQLを学ぼうとしているので、小さなブログシステムを作成しました。

MySQLには3つのテーブルがあります。

posts

id    |  title      
----------------
1     |  Post Title 1         
2     |  Post Title 2  

categories

id    |  title          | parent
--------------------------------
10     |  category10    | 0 
11     |  category11    | 0
12     |  category12    | 10 

post_category_relations

id    |  post_id   |   category_id
----------------------------------
1     |  1         |   10
2     |  2         |   12
3     |  3         |   11

各投稿には複数のカテゴリを含めることができ、それらの関係はpost_category_relationsに保存されます。

category10したがって、index.php?category = 10にアクセスすると、子フォルダーからの投稿も含めて、各投稿に関連するものを取得したいと思いますcategory12

PHPでの未完成のスニペット

$folder_id = $_GET["category"]; // Get Category ID from the URL
$sql = "SELECT * FROM posts 
          JOIN categories
          JOIN post_category_relations
        // And I don't really know what should I do here
        // because I need the child categories first, then the relations
        // then I can get the post too from the post_id of the relations
       ";
mysql_query($sql);

これには高度なMySQLスキルが必要になることはわかっていますが、助けていただければ幸いです。私はすでにこれをPHPで作成しましたが、4つのループを使用する必要があります。これは、MySQLで可能な場合、最善の方法ではありません。方法はまだわかりません:)

4

3 に答える 3

4

PhillipKellerによるこれらの記事はおそらく興味深いものです。

それらはタグをカバーしますが、あなたのクエリ(すなわち、 category1 and category2vs category1 or category2、そしてあなたが書き込もうとしているもの)はほとんど同じになります。

階層データのインデックス作成に関するこの説明も参照してください:MySQLでの階層データの管理

ネストされたセット、タグ、カテゴリなどに関連するSO上の多数のスレッドも同様です。

于 2011-05-20T06:28:53.223 に答える
0

これは1つのSQLです。

 # Take post from castegory $cat_id
    (SELECT P.* 
        FROM 
          posts P, post_category_relations PR 
    WHERE 
       PR.category_id = {$cat_id} AND PR.post_id = P.id
     )
    UNION
    # Take all post from $cat_id child categories
    (SELECT P.* 
        FROM 
          posts P, post_category_relations PR, categories C
    WHERE 
       PR.category_id = C.parent AND PR.post_id = P.id 
       AND C.id = {$cat_id}
     )
于 2011-05-20T06:29:26.330 に答える
0

私はクエリをテストする立場にありませんが、次のようなものを信じています

select * from posts,post_category_relations where post.id=post_category_relations.post_id and
post_category_relations.category_id in (select id from categories where id=? or parent=?)

あなたが探しているものです。

于 2011-05-20T06:20:24.703 に答える