0

私は2つのテーブルを持っています:

1) product data
2) sales stats of these products

表2に、1日あたりの各製品の販売統計を示します。過去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

1つのクエリで必要な結果を取得する方法はありますか?

よろしく、マックス

4

2 に答える 2

0

内側のクエリは先月中に最も売れた10個の製品を取得しますが、外側のクエリは注文なしで5つだけに制限されます。内部クエリを5つに制限する場合は、修正する必要があります。

クエリの結合バージョンは次のとおりです。

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 に答える
0

そこにある2番目のクエリでは、アクティビティの順序がずれていると思います...つまり、製品から始めて、それを修飾します。そのルートに行く場合は、代わりにwherenotexists句を使用します。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 に答える