我有以下情况:不确定如何更好地解释它,但生病了尝试给出一些sql详细信息和有效的方案。
我有一个包含产品的表,一个保留产品标签的表,另一个保存添加到产品中的产品。我可以在一个产品上添加几个标签。
CREATE TABLE product(
id INT auto_increment primary key,
name varchar(255)
);
CREATE TABLE tags(
id INT auto_increment primary key,
tag_name varchar(255)
);
CREATE TABLE product_tag(
id INT auto_increment primary key,
tag_id INT,
product_id INT
);
使用内连接的sql查询给了我:
select
product.name,
tags.tag_name
from product
INNER JOIN product_tag ON product.id = product_tag.product_id
INNER JOIN tags ON product_tag.tag_id = tags.id
结果给了我:
Product 1 | Tag1
Product 1 | Tag2
Product 1 | Tag3
Product 2 | Tag1
Product 2 | Tag3
我想创建一个查询,检查产品1是否有tag1,tag2和tag3是否附加了所有3个标签。想象一下前端用户选择所有树标签,然后我想显示所有树标签都指向它的产品。但是我得到3行,在这个例子中每行只包含一行。什么是正确的方法。
答案 0 :(得分:2)
以下是完整查询:
SELECT
P.id,
P.name
FROM product_tag PT
INNER JOIN tags T ON PT.tag_id = T.id
INNER JOIN product P ON PT.product_id = P.id
WHERE T.tag_name IN ('Tag1','Tag2','Tag3')
GROUP BY PT.product_id
HAVING COUNT(T.id) = 3
此查询将仅输出所有三个标记中涉及的产品ID和名称。
<强>解释强>
只有IN
并不保证单个产品包含所有三个标签。
由于您希望每个product
的结果都是GROUP BY product.id
发挥作用的原因。
后来HAVING COUNT(T.id) = 3
用于过滤掉那些只包含所有三个标签的产品。
答案 1 :(得分:1)
因此您想要计算产品链接到的所选标签的数量
{{1}}
这将为您提供正好链接3个标签的产品ID,其中这些标签的ID为1,2,3。您可以根据您的具体情况将1,2,3替换为另一个选择或变量。