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 by
和 having
:
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
。
加入 products
到 products_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
数据库
产品
+-------------+--------------+------+-----+---------+----------------+
| 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 by
和 having
:
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
。
加入 products
到 products_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