【发布时间】:2012-06-24 20:17:25
【问题描述】:
我有 3 个表:产品、类别和 pro_cat_link。一个产品可以通过 pro_cat_link 表链接到一个或多个类别。
我的查询必须回答以下问题:查找与一组类别匹配的所有产品。例如:查找所有“黄色、水果和甜”的产品。
在 SO 中研究这个问题时,我只能找到我目前使用的解决方案: Complicated SQL Query--finding items matching multiple different foreign keys
就我而言,我的查询如下所示:
SELECT products.id, COUNT(DISTINCT categories.id) as countCat
FROM products
INNER JOIN pro_cat_link ON (pro_cat_link.product_id = products.id)
WHERE pro_cat_link.category_id IN (3,6,8,10)
GROUP BY product.id
ORDER BY product.date DESC
HAVING countCat = 4
换句话说,选择与类别 ID (3,6,8,10) 之一匹配的所有产品,并仅保留恰好匹配 4 个类别的产品。
这很好用,但我遇到了性能问题,因为 COUNT()、GROUP BY、ORDER BY 使得正确的索引非常有限。谁能想到更好的方法来解决这个问题?
【问题讨论】:
-
我假设只是为每个类别进行连接需要太长时间?
-
@Jodaka 是的。管理人员要求用户可以选择任意数量的类别;)
标签: mysql performance indexing