我正在尝试学习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 中可能的最佳方法,我只是还不知道如何:)
你可能会发现菲利普·凯勒的这些文章很有趣:
- 标签: 数据库架构
- 标签系统:性能测试
它们涵盖标签,但您的查询(即 category1 and category2
vs category1 or category2
,以及您尝试编写的那个)将几乎相同。
另请参阅有关索引分层数据的讨论:在 MySQL 中管理分层数据。
以及 SO 上与嵌套集、标签、类别等相关的大量线程。
我无法测试我的查询,但我相信类似的东西
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=?)
是你正在寻找的.
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}
)