MySQL-从多个类别的列表中选择订购最多的产品

时间:2018-07-06 13:40:44

标签: mysql

我正在尝试创建高效的SQL查询,但是遇到了问题。

考虑一个包含以下3个字段的MySQL表。

产品表:

Product ID | Category ID | Orders in the Last 30 Days 

还有其他领域,但对这个问题没有意义。 该表中有140,000个产品。

然后我有了另一个表,该表创建了“嵌套”类别结构。这对于这个问题可能不重要。

类别表:

Category ID | Root ID | Category Name

这将创建类别树,其中“ 0”表示根类别。 该表中大约有2500个类别。

问题:给定类别中最受欢迎的20种产品。如果没有嵌套类别,就足够简单了,但是在我的情况下,我有一个非常“嵌套”的类别结构-我想在所要求的类别以下的所有类别中提供受欢迎的产品。

我有一个perl脚本,它可以非常快速地检索位于所请求类别之下的所有类别。 然后,它形成一个如下所示的SQL查询:

productid ='1'或products ='2'或catid ='3'的catid中选择catid等等等按ordersinlast30d DESC LIMIT 0,20

如果我的“或”列表只有几个,这很好用,但是请记住,如果我要求我的“根”类别之一,或者只是要求类别“ 0”(即下面的每个类别)正在创建一个长度为2500的“或”列表。执行此操作大约需要20秒。 我真正可以等待的最大时间是50-100ms。

在我看来,数据库执行此操作的最简单方法是简单地按ordersinlast30d对整个表进行排序,然后如果需要类别ID,则逐行进行匹配。然后在20处停止。这就是为什么我非常确定必须有一种构造此查询的有效方法的原因。我猜数据库首先要执行我所有的“ WHERE”语句,这是在花时间。

有什么想法我可以对此进行有效的SQL查询吗?

1 个答案:

答案 0 :(得分:0)

我通过使用SQL查询优化器解决了这个问题。

为了将来参考,万一遇到任何麻烦,请使用IN而不是“ OR”

所以

SELECT `productid` FROM `products` WHERE `catid` IN (123,456,789) ORDER BY `orders30d` DESC LIMIT 0,20