MySQL left join where 2nd object is AND is

MySQL left join where 2nd object is AND is

数据库

产品

+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| name        | varchar(128) | NO   | UNI | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+

标签

+---------------+--------------+------+-----+---------+----------------+
| Field         | Type         | Null | Key | Default | Extra          |
+---------------+--------------+------+-----+---------+----------------+
| id            | int(11)      | NO   | PRI | NULL    | auto_increment |
| name          | varchar(128) | NO   |     | NULL    |                |
+---------------+--------------+------+-----+---------+----------------+

products_tags

+------------+---------+------+-----+---------+----------------+
| Field      | Type    | Null | Key | Default | Extra          |
+------------+---------+------+-----+---------+----------------+
| id         | int(11) | NO   | PRI | NULL    | auto_increment |
| product_id | int(11) | NO   | MUL | NULL    |                |
| tag_id     | int(11) | NO   | MUL | NULL    |                |
+------------+---------+------+-----+---------+----------------+

目标

Return 产品 被 2+ 个标签标记,例如“礼物”和“生日”。

它可能看起来像:

SELECT p.name FROM products p
LEFT JOIN products_tags p_t ON p_t.product_id = p.id
LEFT JOIN tags t ON t.id = p_t.tag_id
WHERE <what-is-the-condition?>

缺少 select 标签的正确条件,即礼物和生日。

类似于:

WHERE t.name = 'present' AND t.name = 'birthday';

您可以使用 group byhaving:

SELECT p.name 
FROM products p
INNER JOIN products_tags p_t ON p_t.product_id = p.id
INNER JOIN tags t            ON t.id = p_t.tag_id
WHERE t.tag IN ('present', 'birthday')    -- either one or the other
GROUP BY p.id, p.name
HAVING COUNT(*) = 2                       -- both are present in the group

这假设每个产品没有重复标签。否则,您需要将 HAVING 子句更改为:

HAVING COUNT(DISTINCT t.tag) = 2

不需要tabletags
加入 productsproducts_tags, group by 产品并在 HAVING 子句中设置条件:

SELECT p.id, p.name 
FROM products p INNER JOIN products_tags p_t 
ON p_t.product_id = p.id
GROUP BY p.id, p.name
HAVING COUNT(*) >= 2

如果您的查询特定于任何标签,那么 WHERE 是必须的。我认为你的问题不符合你想要的结果。

SELECT products.name
    FROM  products
    Join products_tags ON products_tags.product_id = products.id
    
    JOIN tags ON tags.id = products_tags.tag_id
    WHERE tags.name = 'present' OR tags.name='birthday' GROUP BY products.name