MYSQL查询关系中的搜索

时间:2016-04-06 07:08:15

标签: mysql

为了清楚起见和这个问题,我会重新命名表格,以便每个人都清楚一点并解释我想要实现的目标:

有一个输入表单,其中包含返回类别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)

所有帮助都深受鼓舞!干杯!

2 个答案:

答案 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

这样查询就很灵活,并且完全符合我的要求! - 只有那些在搜索参数中包含所有类别的产品(不是部分)。

干杯! :)