5

ここでの目標は次のとおりです。 1. 各店舗から各食材の最新の日付を含む行をフェッチします。2. この結果から、価格を比較して各食材の最安値店を見つけます。

個別のクエリで最初または 2 番目の目標を達成できますが、同じクエリでは達成できません。選択範囲を除外してから、前の結果に別のフィルターを適用するにはどうすればよいですか?

編集:残り​​のデータを任意に取得するだけなので、MAX と MIN から取得した結果に問題がありました。これを避けるために、複数の列でテーブルを結合することになっています(推測します)。これが重複した日付などでどのように機能するかわかりません。

クエリとその出力データの画像を含めました。

ここに画像の説明を入力

食材 1 を例にとると、3 つの別々の店舗に存在します (1 つの店舗で異なる日付に 2 回)。

この場合、individual1 の現在の最安価格は store3 になります。2013 年 5 月 25 日の日付の 4 行目がさらに安かったとしても、それは古くなっているため、「勝つ」ことはできません。(ブランド名は無視してください。この問題ではあまり重要ではありません。)

あなたが提供できる助け/情報をいただければ幸いです!

4

3 に答える 3

1

これにはおそらく、いくつかのサブクエリを結合する必要があります。

これはテストされていません(テーブル定義もテストデータもないため)が、次のようなものです:-

SELECT i.name AS ingredient,
        ip.price,
        ip.date,
        s.name AS storename,
        b.name AS brandname
FROM ingredient i
INNER JOIN ingredient_price ip
ON ingredient.ingredient_id = ingredient_price.ingredient_id
INNER JOIN store_to_ingredient_price stip
ON ingredient_price.ingredient_price_id = store_to_ingredient_price.ingredient_price_id
INNER JOIN store s 
ON store_to_ingredient_price.store_id = store.store_id
INNER JOIN brand_to_ingredient_price btip
ON ingredient_price.ingredient_price_id = brand_to_ingredient_price.ingredient_price_id
INNER JOIN brand b
ON brand_to_ingredient_price.brand_id = brand.brand_id  
INNER JOIN  
(
    SELECT i.ingredient_id,
            stip.store_id,
            ip.date,
            MIN(ip.price) AS lowest_price
    FROM ingredient i
    INNER JOIN ingredient_price ip
    ON ingredient.ingredient_id = ingredient_price.ingredient_id
    INNER JOIN store_to_ingredient_price stip
    ON ingredient_price.ingredient_price_id = store_to_ingredient_price.ingredient_price_id
    INNER JOIN
    (
        SELECT i.ingredient_id,
                stip.store_id,
                MAX(ip.date) AS latest_date
        FROM ingredient i
        INNER JOIN ingredient_price ip
        ON ingredient.ingredient_id = ingredient_price.ingredient_id
        INNER JOIN store_to_ingredient_price stip
        ON ingredient_price.ingredient_price_id = store_to_ingredient_price.ingredient_price_id
        GROUP BY ingredient_id, store_id
    ) Sub1
    ON i.ingredient_id = Sub1.ingredient_id
    AND stip.store_id = Sub1.store_id
    AND ip.date = Sub1.latest_date
    GROUP BY i.ingredient_id, stip.store_id, ip.date
) Sub2
ON  i.ingredient_id = Sub2.ingredient_id
AND stip.store_id = Sub2.store_id
AND ip.date = Sub2.date
AND ip.price = Sub2.lowest_price
于 2014-03-20T12:15:41.653 に答える