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

MySQL-从多个类别的列表中选择订购最多的产品,mysql,Mysql,我试图创建一个高效的SQL查询,但遇到了问题 考虑一个包含以下3个字段的MySQL表 产品表: Product ID | Category ID | Orders in the Last 30 Days 还有其他领域,但对这个问题没有意义。 此表中有140000种产品 然后我有另一个表,它创建了一个“嵌套”类别结构。这对于这个问题可能重要,也可能不重要 类别表: Category ID | Root ID | Category Name 这将创建一个类别树,“0”表示根类别。 此表中约有2

我试图创建一个高效的SQL查询,但遇到了问题

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

产品表:

Product ID | Category ID | Orders in the Last 30 Days 
还有其他领域,但对这个问题没有意义。 此表中有140000种产品

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

类别表:

Category ID | Root ID | Category Name
这将创建一个类别树,“0”表示根类别。 此表中约有2500个类别

问题:给我一个给定类别中最受欢迎的20种产品。如果没有嵌套的类别,这就足够简单了,但是在我的例子中,我有一个非常“嵌套”的类别结构——我想提供所有类别中的流行产品,这些类别“低于”所请求的类别

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

products
中选择
productid
,其中
catid
='1'或
catid
='2'或
catid
='3'。。。。。etc etc订单依据
ordersinlast30d
DESC限额0,20

如果我的“或”列表只有几长,这很好,但是请记住,如果我要求这是我的一个“根”类别,或者只要求类别“0”(即下面的每个类别),这将创建一个2500长的“或”列表。这需要20秒的时间来执行。 实际上,50-100毫秒是我能真正等待的最大值

对我来说,数据库执行这项操作的最简单方法似乎是按照
ordersinlast30d
对整个表进行排序,然后在请求类别ID时逐行进行匹配。然后在20点停车。这就是为什么我确信一定有一种有效的方法来构造这个查询。我猜数据库首先会执行我所有的“WHERE”语句,这需要时间


你知道我该如何对此进行有效的SQL查询吗

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

为便于将来参考,如果有人无意中发现了这一点,请使用not“或”

所以

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