繁体   English   中英

如何查询多对多

[英]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进行测试,否则您可能会发现推迟一段时间。 您可以为此目的下载免费评估版

重复评论中提到的要点:

  • 正如@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:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM