首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在多到多关系中对同一字段的多个不同值进行选择

在多到多关系中对同一字段的多个不同值进行选择
EN

Stack Overflow用户
提问于 2015-03-30 15:07:37
回答 2查看 72关注 0票数 1

我不确定标题是否真的有用,所以这里有我的问题,这里有三个表:

猫:

代码语言:javascript
复制
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(255) | NO   |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+

标签:

代码语言:javascript
复制
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(255) | NO   |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+

cats_tags:

代码语言:javascript
复制
+--------+---------+------+-----+---------+----------------+
| Field  | Type    | Null | Key | Default | Extra          |
+--------+---------+------+-----+---------+----------------+
| id     | int(11) | NO   | PRI | NULL    | auto_increment |
| id_cat | int(11) | NO   |     | NULL    |                |
| id_tag | int(11) | NO   |     | NULL    |                |
+--------+---------+------+-----+---------+----------------+

让我们假设表中填充了10个猫,5个标签(id 1到5),并且这些猫每个都有一些随机标记。

如何选择具有完整标签列表的所有猫?

例如,我如何列出标记为2和3的猫(可以是1,2和3,或2,3和4),而不是只有2或3或没有这两个标记的猫?

我不确定这是标准sql,我想用mysql来实现。

编辑:

我试过了:

代码语言:javascript
复制
select
    c.id, c.name
from
    cats c
inner join cats_tags r on c.id = r.id_cat
where
    r.id_tag in (:tags)
group by c.id

我记得,如果任何猫至少有我想要的:标签列表,我就会把它带走。我只想要有我所有标签的猫。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-30 15:29:10

您可能会这样处理这个问题:

代码语言:javascript
复制
SELECT cat_id
FROM (
    SELECT DISTINCT cat_id, tag_id
    FROM cat_tags
    WHERE tag_id IN (2,3)
  ) tag23
GROUP BY cat_id
HAVING COUNT(*) = 2

内联视图是必需的,因为没有什么可以阻止相同(cat、标记)配对在cat_tags中多次出现;如果可以假设(由于DB约束)不会发生此类重复,则可以更简单地表示查询。

如果需要获取猫名,可以将cat加入到结果中。

票数 2
EN

Stack Overflow用户

发布于 2015-03-30 15:13:48

使用where exists...subquery

代码语言:javascript
复制
select distinct c.* 
from cat c 
where exists
(  select 1 from cats_tags ct
   join tags t on ct.id_tag=t.id
   where t.id=2 and c.id=ct.id_cat
)
and exists
(  select 1 from cats_tags ct
   join tags t on ct.id_tag=t.id
   where t.id=3 and c.id=ct.id_cat
)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29349730

复制
相关文章

相似问题

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