在下面的示例中,我有三个MySQL (InnoDB)表,其中包含有关饮料及其特性的信息。
表:饮料
+------------------------+
|INT id | VARCHAR name |
+------------------------+
| 1 | coca-cola |
+------------------------+
| 2 | water |
+------------------------+
| 3 | mineral-water |
+------------------------+表:标记
+-------------------------+
|INT id | VARCHAR tagName |
+-------------------------+
| 1 | clear |
+-------------------------+
| 2 | carbonated |
+-------------------------+
| 3 | flavoured |
+-------------------------+表:标记的
+------------------------------------+
|INT id | INT beverageId | INT tagId |
+------------------------------------+
| 1 | 1 | 2 | (coca-cola is carbonated)
+------------------------------------+
| 2 | 1 | 3 | (coca-cola is flavoured)
+------------------------------------+
| 3 | 2 | 1 | (water is clear)
+------------------------------------+
| 4 | 3 | 1 | (mineral-water is clear)
+------------------------------------+
| 5 | 3 | 2 | (mineral-water is carbonated)
+------------------------------------+
The fields "beverageId" and "tagId" are foreign keys to the table "beverages".我想要构建一个查询,允许我提供任意数量的标签,结果将是所有的饮料id都有这些标签。查询将包含任意数量的标记。
所以问题是;
谢谢
发布于 2013-12-16 21:33:38
THe下面的结构提供了一些关于您可以做什么的指导。下面是将标记is作为独立变量提供的一种方法:
select beverageid
from tagged t
group by beverageid
having sum(tagid = TAGID1) > 0 and
sum(tagid = TAGID2) > 0 and
. . . ;这样的查询很难生成,因为having子句中的子句数量是不同的。
下面是另一种方法,它假设标记位于逗号分隔列表中:
select beverageid
from tagged t
where find_in_set(tagid, TAGLIST) > 0
group by beverageid
having count(distinct tagid) =
(length(TAGLIST) - length(replace(TAGLIST, ',', '')) + 1;这里唯一的混乱之处是计算标签的数量。
如果您正在动态地构造查询,那么当tagid上有一个索引时,下面的结果应该是最好的
select beverageid
from tagged t
where tagid in (TAGLIST)
group by beverageid
having count(distinct tagid) = LENGTH OF TAGLIST;https://stackoverflow.com/questions/20621231
复制相似问题