[英]How to query many to many
我正在尝试对这些字段进行多对多的查询。 我想得到:
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会处理这些差异,还是需要重新编写这些查询。
提前致谢。
我正在使用详细的连接语法来更清楚地了解表的相关性。
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)帖子中的所有类别
给定post id,您只需要加入bridge和category表。
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 Long进行测试,否则您可能会发现推迟一段时间。 您可以为此目的下载免费评估版 。
重复评论中提到的要点:
posts.category_id
字段。 在多对多关系中,桥(也称为“交汇点”,“连接”,“地图”,“链接”等)表将帖子链接到多个类别 - 如果只有一个,则会使用posts
表上的单个字段类别是允许的。 posts.id
是int(11)
,那么post_category_bridge.post_id
也应该是int(11)
。 强制执行外键约束的大多数(全部?)数据库都需要这个(包括MySQL)。 为什么? 如果一个帖子可以有4294967295(由4字节int
支持),桥接表中只有少数点支持链接到255个帖子(由1字节tinyint
支持) unsigned
。 这有帮助吗?
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'
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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.