选择依赖于表中其他行的行

时间:2012-10-27 10:28:27

标签: mysql

道歉,如果以前曾经问过,但我真的不知道要搜索什么,因此不确定如何用手指划过问题标题。

我正在构建一个非常常见的系统,其中一个产品可以有多个类别,而在前端,用户可以搜索指定多个类别的产品。

假设我们有以下架构和数据(我无法发布图片,道歉,请参阅链接) -

表名:product_categories

数据:

enter image description here

产品表非常标准 - 身份证,姓名,金额等。

所以产品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。

这是一个更大的查询的一部分,但是,如果我设法找到一个,我将能够应用该解决方案。

3 个答案:

答案 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,它会检查返回的唯一记录的数量,并确保它等于提供的类别数量。

干杯, 达伦