我不确定标题是否真的有用,所以这里有我的问题,这里有三个表:
猫:
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | NO | | NULL | |
+-------+--------------+------+-----+---------+----------------+标签:
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | NO | | NULL | |
+-------+--------------+------+-----+---------+----------------+cats_tags:
+--------+---------+------+-----+---------+----------------+
| 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来实现。
编辑:
我试过了:
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我记得,如果任何猫至少有我想要的:标签列表,我就会把它带走。我只想要有我所有标签的猫。
发布于 2015-03-30 15:29:10
您可能会这样处理这个问题:
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加入到结果中。
发布于 2015-03-30 15:13:48
使用where exists...subquery
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
)https://stackoverflow.com/questions/29349730
复制相似问题