0

我有两张桌子:

1) product data
2) sales stats of these products

在表 2 中,我有每种产品每天的销售统计数据。我想获得过去 30 天内最畅销的产品。我通过以下查询实现了这一点:

SELECT sku
FROM    prod_history
WHERE insert_date >= SUBDATE(CURDATE(), INTERVAL 31 DAY)
GROUP BY sku
ORDER BY SUM(number_of_orders) DESC 
LIMIT 0, 10

此查询大约需要 4.5 秒。

现在我想将此查询结果与产品数据表 (1) 连接起来。

我为此使用以下查询,但得到的结果不正确。 我收到的结果往往不是最畅销的产品。

SELECT `prod_combined`.`sku`, `prod_combined`.`titel`, `prod_combined`.`preis_vk`, `prod_combined`.`link` 
FROM `prod_combined` 
WHERE (prod_combined.sku IN 
    (SELECT prod_combined.sku 
        FROM (SELECT sku FROM prod_history WHERE insert_date >= SUBDATE(CURDATE(), INTERVAL 31 DAY) 
        GROUP BY sku ORDER BY SUM(number_of_orders) DESC LIMIT 0 , 10 
     ) q 
     JOIN prod_combined ON prod_combined.sku = q.sku ) 
) 
AND (aktiv = 1) LIMIT 5

有没有办法在一个查询中获得所需的结果?

亲切的问候,麦克斯

4

2 回答 2

0

我只是认为您的活动顺序在您的第二个查询中是关闭的......即您从产品开始,然后对其进行限定。如果我要走那条路,我会改用 where not exists 子句;数量大于我的产品数量的 x sku 不存在。

但是,您是否有理由不能将您的产品数据加入到您的原始数据中?

SELECT a.sku, a.titel, a.preis_vk, a.link, SUM(b.number_of_orders) as number_of_orders 
FROM prod_combined as a inner join 
     prod_history as b on a.sku = b.sku
WHERE b.insert_date >= SUBDATE(CURDATE(), INTERVAL 31 DAY)
GROUP BY a.sku, a.titel, a.preis_vk, a.link
ORDER BY SUM(b.number_of_orders) DESC 
LIMIT 0, 10

或者沿着这些路线。

于 2012-04-18T09:28:14.767 回答
0

内查询得到上个月最畅销的十个产品,而外查询只限制了五个没有任何订购。如果您将内部查询限制为五个,则应该修复它。

这是查询的联接版本:

SELECT `prod_combined`.`sku`, `prod_combined`.`titel`, `prod_combined`.`preis_vk`, `prod_combined`.`link`
FROM `prod_combined` 
INNER JOIN `prod_history`
ON prod_combined.sku = prod_history.sku
WHERE prod_history.insert_date >= SUBDATE(CURDATE(), INTERVAL 31 DAY) 
  AND prod_combined.aktiv = 1
GROUP BY `prod_combined`.`sku`, `prod_combined`.`titel`, `prod_combined`.`preis_vk`, `prod_combined`.`link`
ORDER BY SUM(prod_history.number_of_orders) DESC
LIMIT 5
于 2012-04-18T09:21:59.997 回答