2

抱歉,如果以前有人问过这个问题,但我真的不知道要搜索什么,因此不知道如何措辞问题标题,所以手指交叉。

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

假设我们有以下架构和数据(我还不能发布图片,抱歉,请参阅链接)-

表名:product_categories

数据:

在此处输入图像描述

产品表非常标准 - id、名称、金额等。

所以产品 1 有 2 个类别。

如果用户在搜索页面上选中代表类别 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。

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

4

3 回答 3

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 大于数千万行,否则如果创建了正确的索引,这两种解决方案都应该可以正常工作。

于 2012-10-27T10:46:15.283 回答
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 以来很长时间)

于 2012-10-27T10:48:08.027 回答
0

非常感谢小伙伴们的建议,非常感谢。我认为找到了一个解决方案,这似乎产生了预期的结果,但我将围绕我的方法编写更多单元测试以确保它有效。

我找到的解决方案如下:

select * from products_categories where category_id in (2,3) HAVING count(distinct(id)) = 2 

因此,它使用 WHERE IN,然而,使用 HAVING,它会检查返回的唯一记录的数量,并确保它等于提供的类别数量。

干杯,达伦

于 2012-10-28T10:12:57.347 回答