如何在mysql上使用左内连接匹配多行

时间:2016-08-18 15:02:19

标签: mysql database

我有以下情况:不确定如何更好地解释它,但生病了尝试给出一些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行,在这个例子中每行只包含一行。什么是正确的方法。

2 个答案:

答案 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用于过滤掉那些只包含所有三个标签的产品。

WORKING DEMO

答案 1 :(得分:1)

因此您想要计算产品链接到的所选标签的数量

{{1}}

这将为您提供正好链接3个标签的产品ID,其中这些标签的ID为1,2,3。您可以根据您的具体情况将1,2,3替换为另一个选择或变量。