【问题标题】:MySQL where IN from joined tableMySQL where IN 来自连接表
【发布时间】:2020-02-14 15:34:19
【问题描述】:
i have 2 tables (example):
product:
| id | name |
| 1 | product1 |
| 2 | product2 |
| 3 | product3 |
product_categories:
| product_id | category_id |
| 1 | 5 |
| 1 | 3 |
| 2 | 5 |
| 3 | 17 |
| 3 | 5 |
我想选择类别 id 为 5 和 3 的产品。
SELECT p.*
FROM products p
LEFT
JOIN product_categories pc
ON pc.product_id = p.id
WHERE ?
【问题讨论】:
标签:
mysql
join
where-clause
【解决方案1】:
SELECT p.* FROM products p LEFT JOIN product_categories pc ON (pc.product_id = p.id) AND pc.category_id in (3,5);
(in case you do want unmatched rows)
或者
SELECT p.* FROM products p INNER JOIN product_categories pc ON (pc.product_id = p.id) WHERE pc.category_id in (3,5)
(if you're sure that you don't)
【解决方案2】:
没有必要使用LEFT JOIN,因为您不想要不匹配的行。
按产品分组,并在HAVING 子句中设置产品具有两个类别的条件:
SELECT p.id, p.name
FROM products p INNER JOIN product_categories pc
ON pc.product_id = p.id
WHERE pc.category_id IN (3, 5)
GROUP BY p.id, p.name
HAVING COUNT(DISTINCT pc.category_id) = 2
【解决方案3】:
你可以这样写:
SELECT p.* FROM products p
LEFT JOIN product_categories pc ON (pc.product_id = p.id)
WHERE category_id IN (5,3)