我正在尝试对这些字段进行多对多的查询。我想得到:
1)所有类别中的帖子
2)帖子中的所有类别
3)类别中具有特定ID
的所有帖子 posts
+-------------+--------------+
| id | int(11) |
| title | varchar(255) |
| body | text |
| parent_id | int(11) |
| category_id | int(11) |
+-------------+--------------+
post_categories
+----------+--------------+
| id | int(11) |
| category | varchar(255) |
+----------+--------------+
post_category_bridge
+-------------+-------------+
| id | int(11) |
| post_id | int(11) |
| category_id | int(11) |
+-------------+-------------+
我担心的一件事是我在MySQL数据库上使用PHP的PDO进行开发,但我会在发布日将网站转移到SQL Server。我知道MySQL和SQL Server之间存在差异。 POD会处理这些差异,还是需要重新编写这些查询。
提前致谢。
答案 0 :(得分:4)
我正在使用详细的连接语法来更清楚地了解表的相关性。
1)所有类别中的帖子
根据类别名称,您需要加入所有三个表。
select p.*
from post_category c
join post_category_bridge b on c.id = b.category_id
join posts p on p.id = b.post_id
where c.category = ?
2)帖子中的所有类别
鉴于帖子ID,您只需加入桥牌和类别表。
select c.*
from post_category_bridge b
join post_category c on c.id = b.category_id
where b.post_id = ?
3)类别中具有特定ID
的所有帖子我认为你的意思是在category.id
处查找帖子(而不是category.name
),类似于(1)但不需要加入类别表,因为你已经知道了ID;你只需要加入桥牌并张贴表格。
select p.*
from post_category_bridge b
join posts on p.id = b.post_id
where b.category_id = ?
我将在发布日将网站转移到SQL Server ... POD会处理这些差异,还是需要重新编写这些查询。
这取决于最终在您的系统中的查询。如果您正在编写自己的SQL,那么在开发期间使用MySQL特有的功能或语法会很重要。我强烈建议在SQL Server 很久发布日进行测试,否则您可能会发现推迟一段时间。您可以为此目的下载免费的evaluation version。
评论中提到的重复点:
posts.category_id
字段。在多对多关系中,桥(也称为“交汇点”,“加入”,“地图”,“链接”等)表将帖子链接到多个类别 - posts
表上的单个字段将是如果只允许一个类别,则使用。posts.id
为int(11)
,则post_category_bridge.post_id
也应为int(11)
。强制执行外键约束的大多数(全部?)数据库都需要这个(包括MySQL)。为什么?如果可以有4294967295个帖子(由4个字节int
支持),那么桥接表中只有少数点支持链接到255个帖子(由1个字节tinyint
支持)unsigned
。答案 1 :(得分:0)
这有帮助吗?
1:
select p.* from posts p, post_categories c
where p.category_id=c.id and category='something'
2:
select c.* from post_categories, posts p
where p.category_id=c.id and post_id=something
3:
select p.* from post_categories, posts p
where p.category_id=c.id and post_id=something and category='something'
答案 2 :(得分:0)
select a.* from posts a, post_categories b, post_category_bridge c
WHERE
b.category="mycat" AND
b.id=c.category_id AND
a.id = c.post_id;
select b.category from posts a, post_categories b, post_category_bridge c,
WHERE
c.post_id='PostID' AND
b.id = c.category_id;
select a.* from posts a, post_categories b, post_category_bridge c
WHERE
b.category="mycat" AND
c.category_id = b.id AND
c.post_id = 'MyID' AND
a.id = c.post_id;