如何查询多对多

时间:2010-06-29 00:43:09

标签: php sql mysql sql-server-2008 pdo

我正在尝试对这些字段进行多对多的查询。我想得到:

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会处理这些差异,还是需要重新编写这些查询。

提前致谢。

3 个答案:

答案 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

评论中提到的重复点:

  • @freddy所述,您不需要posts.category_id字段。在多对多关系中,桥(也称为“交汇点”,“加入”,“地图”,“链接”等)表将帖子链接到多个类别 - posts表上的单个字段将是如果只允许一个类别,则使用。
  • @JamieWong所述,您应该保持表键和外键之间的类型一致,例如:如果posts.idint(11),则post_category_bridge.post_id也应为int(11)。强制执行外键约束的大多数(全部?)数据库都需要这个(包括MySQL)。为什么?如果可以有4294967295个帖子(由4个字节int支持),那么桥接表中只有少数点支持链接到255个帖子(由1个字节tinyint支持)
  • 虽然你在...但也可以制作ID(以及这些ID的FK)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;