首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何查询多对多

如何查询多对多
EN

Stack Overflow用户
提问于 2010-06-29 08:43:09
回答 3查看 1.1K关注 0票数 1

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

1)类别中的所有帖子

2)帖子中的所有类别

3)具有特定id的类别中的所有帖子

代码语言:javascript
复制
    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是否会处理这些差异,或者我是否需要重写这些查询。

提前谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-06-29 11:45:47

我使用详细的连接语法是为了更清楚地说明表是如何相关的。

1)类别中的所有帖子

给定类别名称,您需要连接所有三个表。

代码语言:javascript
复制
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,您只需加入桥接表和类别表。

代码语言:javascript
复制
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表。

代码语言:javascript
复制
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

在评论中提到的值得重复的观点:

  • 正如@freddy提到的,您不需要posts.category_id字段。在多对多关系中,桥(也称为“连接”、“连接”、“映射”、“链接”等)表将帖子链接到多个类别-如果只允许一个类别,则posts表上的单个字段将被使用。
  • 正如@JamieWong提到的,您应该保持表键和外键之间的类型一致,例如,如果posts.idint(11),那么post_category_bridge.post_id也应该是int(11)。大多数(全部?)实施外键约束的数据库将需要这样做(包括MySQL)。为什么?如果可以有4294967295个帖子(由4字节的int支持),那么在桥接表中只支持到255个帖子的链接就没有什么意义了(由1字节的tinyint)
  • While int支持)……最好将ID(和那些ID的FK)设为unsigned.
票数 4
EN

Stack Overflow用户

发布于 2010-06-29 08:53:25

这有帮助吗?

1:

代码语言:javascript
复制
select p.* from posts p, post_categories c
where p.category_id=c.id and category='something'

2:

代码语言:javascript
复制
select c.* from post_categories, posts p
where p.category_id=c.id and post_id=something

3:

代码语言:javascript
复制
select p.* from post_categories, posts p
where p.category_id=c.id and post_id=something and category='something'
票数 0
EN

Stack Overflow用户

发布于 2010-06-29 09:36:49

代码语言:javascript
复制
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;
代码语言:javascript
复制
select b.category from posts a, post_categories b, post_category_bridge c,
WHERE
    c.post_id='PostID' AND
    b.id = c.category_id;
代码语言:javascript
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3137128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档