道歉,如果以前曾经问过,但我真的不知道要搜索什么,因此不确定如何用手指划过问题标题。
我正在构建一个非常常见的系统,其中一个产品可以有多个类别,而在前端,用户可以搜索指定多个类别的产品。
假设我们有以下架构和数据(我无法发布图片,道歉,请参阅链接) -
表名:product_categories
数据:
产品表非常标准 - 身份证,姓名,金额等。
所以产品1有两个类别。
如果用户检查搜索页面上代表类别2和3的2个复选框,我将如何查询,以便只有具有这两个类别的产品才会回来?
如下所示的内容不起作用,因为在类别ID为2且类别ID为3的行中没有一行:
SELECT * from product_categories where `category_id` = 2 AND `category_id` = 3;
我已经尝试过使用WHERE IN,但是,即使我正在寻找同时具有类别ID 2和6(例如)我不想要的产品,这也会返回产品1。
这是一个更大的查询的一部分,但是,如果我设法找到一个,我将能够应用该解决方案。
答案 0 :(得分:0)
这种方式应该有效
SELECT * FROM products WHERE
EXISTS (SELECT * FROM product_categories
WHERE product_id = products.id AND category_id = 2)
AND
EXISTS (SELECT * FROM product_categories
WHERE product_id = products.id AND category_id = 3)
...
其他解决方案是为每个类别生成JOIN。
SELECT * FROM products
JOIN product_categories AS cs1 ON cs1.product_id = products.id
AND cs1.category_id = 2
JOIN product_categories AS cs2 ON cs2.product_id = products.id
AND cs2.category_id = 3
...
除非您期望product_categories大于数千万行,否则如果创建了正确的索引,两个解决方案都应该合理地工作。
答案 1 :(得分:0)
我认为你需要在这里使用一个子查询:
SELECT * from product_categories where id IN (SELECT id from product_categories where `category_id` = 2) AND IN (SELECT id from product_categories where `category_id` = 3)
我并非100%确定这是有效的(自从我使用SQL以来已经很久了)
答案 2 :(得分:0)
非常感谢你们的建议,非常感谢。我认为找到了一个解决方案,这似乎产生了预期的结果,但我将围绕我的方法编写更多的单元测试以确保其有效。
我找到的解决方案如下:
select * from products_categories where category_id in (2,3) HAVING count(distinct(id)) = 2
因此,这使用WHERE IN,但是,使用HAVING,它会检查返回的唯一记录的数量,并确保它等于提供的类别数量。
干杯, 达伦