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 中:

因此,当我访问 index.php?category=10 时,我想获取每个category10帖子与其子文件夹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

您可能会发现 Phillip Keller 的这些文章很有趣:

它们涵盖标签,但您的查询(即category1 and category2vscategory1 or category2和您要编写的查询)几乎相同。

另请参阅有关索引分层数据的讨论:在 MySQL 中管理分层数据

以及 SO 上与嵌套集、标签、类别等相关的大量线程。

于 2011-05-20T06:28:53.223 回答
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 回答
0

这是一个 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 回答