,我有以下数据:简化和/或优化与INTERSECT SQL查询或HAVING
tag_id | taggable_id
--------+-------------
1 | 1
2 | 1
3 | 1
4 | 1
1 | 2
2 | 2
5 | 2
6 | 2
7 | 3
8 | 3
9 | 3
10 | 3
而且我希望把所有这一切都是在一组tag_ids的,而在另一个组和另一个taggable_ids .. (最多4组)。
例如:
- 如果我搜索所有与TAG_ID 1或7 AND TAG_ID的taggable_ids 4应该返回仅有1
- 如果我搜索所有与TAG_ID 1 taggable_ids AND TAG_ID 6和TAG_ID 2或8应返回仅有2
- 如果我搜索所有TAG_ID 8 taggable_ids和TAG_ID 5不应该返回IDS
在一个总的方式(对第二个例子),查询如下:
SELECT taggable_id FROM taggings WHERE tag_id in (1)
INTERSECT
SELECT taggable_id FROM taggings WHERE tag_id in (6)
INTERSECT
SELECT taggable_id FROM taggings WHERE tag_id in (2,8)
我想简化它,它看起来像:
SELECT taggable_id FROM taggings WHERE tag_id in (1,2,6,8)
GROUP BY taggable_id HAVING COUNT(*)=3
,但我不知道是否能以更简单的方式来完成。有什么想法吗?
你的第二个查询看起来很简单。 – 2014-12-05 19:17:56
'(tag_id,taggable_id)'被定义为唯一的,对吧? – 2014-12-05 21:49:47
您的查询与您的描述不符。而你的第二个是*不等于第一个。提出一个一致的例子将是谨慎的。 – 2014-12-05 22:23:21