0

私はカスタムメイドの電子商取引プラットフォームの製品に対して次のデータ構造を持っています (まだ開発中なので、親切にしてください:P)。

これは、製品の価格表の現在の定義です (特定の製品ごとの価格の変化に関するタイムリーなレポートを作成するために、別の方法でモデル化することにしました)

CREATE TABLE IF NOT EXISTS commerce_products_price (
    price_id INT(11) NOT NULL AUTO_INCREMENT,
    product_id INT(11) NOT NULL,
    price FLOAT NOT NULL,
    price_offer FLOAT,
    date_added DATETIME NOT NULL
    PRIMARY KEY (price_id)
) ENGINE=InnoDB DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

価格が下がっている製品のリストを (ID ごとに) 取得したいと考えています。現在、シミュレートした SQL クエリは次のようになります。

SELECT 
DISTINCT(p1.product_id) AS product_id
FROM commerce_products_price p1 
INNER JOIN commerce_products_price p2 ON (p1.product_id = p2.product_id) AND (p2.date_added > p1.date_added)
WHERE p2.price < p1.price

この背後にある理由は、最新の 2 つの価格履歴エントリを取得して相互に比較することです。2 番目の価格が最初の価格よりも低い場合、その製品の価格は下がります。

ここに、私が設定したSQL Fiddleがあります。私は MySQL 5.5 (私の VM にあるデータベース エンジン) をターゲットにしました。

しかし、それは私が望むようには機能しておらず、何かが欠けていると確信しています。クエリを作成するためのベースとして、この質問を選択しました。このクエリに追加したいもう 1 つのことは、特定のしきい値 (ala DATEDIFF(...) <= 15) で価格が下がった製品のリストを取得する機能ですが、それは のようなものを追加することの問題だと思いDATEDIFF(p1.date_added, NOW()) BETWEEN ? AND ?ます。

どんなヒントでも大歓迎です:)

4

1 に答える 1

0

これを試して:

SELECT 
p1.product_id
FROM commerce_products_price p1 
LEFT JOIN commerce_products_price p2 ON (p1.product_id = p2.product_id)
LEFT JOIN (
    Select p3.product_id, max(date_added) as maxD,min(date_added) as minD 
    from commerce_products_price p3
    group by p3.product_id
) p4 ON (p1.product_id = p4.product_id)
WHERE p2.price < p1.price
AND p2.date_added = p4.maxD AND p1.date_added = p4.minD
于 2016-01-29T14:09:16.020 に答える