为了清楚起见和这个问题,我会重新命名表格,以便每个人都清楚一点并解释我想要实现的目标:
有一个输入表单,其中包含返回类别ID的选项。如果'产品'有'类别',我想返回/找到'产品'可以说有多个类别(或只有1个),它的所有类别都在从表单传递的数组中。
产品表
ID Title
1 Pizza
2 Ice Cream
分类表
ID Title
1 Baked food
2 Hot food
ProductsCategories表
ID ProductId CategoryId
1 1 1
2 1 2
因此,如果我传递[1,2],则查询应返回ID为1的Product,因为所有ProductsCategories都在请求的数组中,但如果我只传递1或2,则查询应该不返回任何结果。
目前我有以下查询可行,但出于某种原因,如果我创建第二个产品并创建一个与第一个产品相同的CategoryId的ProductCategory,则查询返回nulll ...
SELECT products.*
FROM products
JOIN products_categories
ON products_categories.product_id= products.id
WHERE products_categories.category_id IN (1, 2)
HAVING COUNT(*) = (select count(*) from products_categories pc
WHERE pc .product_id = products.id)
所有帮助都深受鼓舞!干杯!
答案 0 :(得分:1)
为了匹配IN
子句中的所有值,您只需要知道必须在HAVING
子句中使用它的传递类别的数量:
SELECT
p.*,
GROUP_CONCAT(c.title) AS categories
FROM
Products p
INNER JOIN ProductsCategories pc ON pc.productId = p.ID
INNER JOIN Categories c ON c.ID = pc.categoryId
WHERE
pc.categoryId IN (1,2)
GROUP BY
p.id
HAVING
COUNT(DISTINCT pc.categoryId) = 2 -- this is # of unique categories in IN clause
所以如果IN (1,2)
结果是:
+----+-------+---------------------+
| id | title | categories |
+----+-------+---------------------+
| 1 | Pizza | Baked Food,Hot Food |
+----+-------+---------------------+
1 row in set
如果IN (1,3)
结果为Empty set
(无结果)。
答案 1 :(得分:0)
@mitkosoft,谢谢你的回答,但遗憾的是查询没有产生所需的结果。如果产品的类别部分在传递的类别中,则仍会返回产品。另外,我可能不知道表单发送了多少参数。
幸运的是,我设法创建了一个可以完成这个技巧的查询并且工作得很好(至少到目前为止)
img
这样查询就很灵活,并且完全符合我的要求! - 只有那些在搜索参数中包含所有类别的产品(不是部分)。
干杯! :)