我正在尝试对这些字段执行多对多查询。我想要得到:
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进行开发,但我会在发布当天将站点转移到SQL Server。我知道MySQL和SQL Server之间存在差异。POD是否会处理这些差异,或者我是否需要重写这些查询。
提前谢谢。
发布于 2010-06-29 11:45:47
我使用详细的连接语法是为了更清楚地说明表是如何相关的。
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),但不需要连接到category表,因为您已经知道id;您只需要连接桥接表和post表。
select p.*
from post_category_bridge b
join posts on p.id = b.post_id
where b.category_id = ?我将在启动day...Will POD时将站点转移到SQL Server,请注意这些差异,否则我将需要重写这些查询。
这取决于最终进入系统的查询。如果您正在编写自己的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)int支持)……最好将ID(和那些ID的FK)设为unsigned.发布于 2010-06-29 08:53:25
这有帮助吗?
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=something3:
select p.* from post_categories, posts p
where p.category_id=c.id and post_id=something and category='something'发布于 2010-06-29 09:36:49
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;https://stackoverflow.com/questions/3137128
复制相似问题