2

私は2日間答えを探していましたが、まだ何もありません。私を助けてください。

製品、製品の価格、およびこの価格が登録された日付のデータベースがあります。

product_id | price | date
-------------------------
    1      | 8.95  | 2012-12-01
    2      | 3.40  | 2012-12-01
    1      | 9.05  | 2012-12-19
    3      | 2.34  | 2012-12-24
    3      | 2.15  | 2012-12-01
    1      | 8.80  | 2012-12-19
    1      | 8.99  | 2012-12-02
    2      | 3.45  | 2012-12-02

同じ日に商品の価格が異なる可能性があることを確認します (行 3 と 6)。これは、1 つの製品に対して多数のサプライヤーが存在するためです。データベースにもサプライヤーの列がありますが、ソリューションとは無関係であることがわかりました。私が間違っている場合は、ソリューションに追加できます。

基本的に私が望むのは、次のように、2 つの結合されたデータ セットを返すクエリを作成することです。

  • 最初のセットは、先月に挿入された製品の最低価格によって作成されます。今日は 1 月 15 日なので、クエリは行 3、4、および 6 を読み取り、最低価格を適用して、行 4 と 6 のみを返す必要があります。どちらも先月のその製品の最低価格です。
  • 2 番目のセットは、先月に価格が登録されていない、最後に挿入された製品によって作成されます。つまり、最初のセットに表示されていない製品の場合、クエリは最後に挿入された製品を検索する必要があります。

それが明確であることを願っています。そうでない場合は、もっと聞いてください。

このデータベースのクエリ結果は次のようになります。

product_id | price | date
-------------------------
    1      | 8.80  | 2012-12-19 <-Min price for product 1 on last month
    3      | 2.34  | 2012-12-24 <-Min price for product 3 on last month
    2      | 3.45  | 2012-12-02 <-No reg for product 2 on last month, show last reg.

すべてを試しました: UNION、(DATE_SUB(CURDATE()、INTERVAL 1 MONTH)、MIN(価格)、MAX(日付) など。

4

4 に答える 4

1
(SELECT product_id, MIN(price), date
FROM products
WHERE date + INTERVAL 1 MONTH > NOW()
GROUP BY product_id)
UNION
(SELECT product_id, price, MAX(date)
FROM products
WHERE product_id NOT IN (SELECT product_id
    FROM products
    WHERE date + INTERVAL 1 MONTH > NOW()
    GROUP BY product_id)
GROUP BY product_id)

これは機能するはずですが、それが最も最適化された方法であるかどうかはわかりません。

于 2013-01-15T14:39:55.977 に答える
0

いくつかのサブクエリに分割します。

  • 先月の価格の商品、最小価格
    • その価格で参加する

連合

  • 先月、最大日付で価格のない商品
    • その日の価格に参加する

SQL フィドル

ここ

クエリ

SELECT MINPRICE.product_id, P.date, MINPRICE.price
    FROM
    (
        -- Min price in last 31 days
        SELECT product_id, MIN(price) AS price
            FROM Prices
            WHERE DATEDIFF(CURDATE(), date) < 31
            GROUP BY product_id
    ) MINPRICE
    -- Join in to get the date that the price occured on
    INNER JOIN Prices P ON
        P.product_id = MINPRICE.product_id
        AND
        P.price = MINPRICE.price
UNION
SELECT MAXDATE.product_id, MAXDATE.date, P.price
    FROM
    (
        -- Product with no price in last 31 days - get most recent date
        SELECT product_id, MAX(date) AS date
            FROM Prices
            WHERE product_id NOT IN
            (
                SELECT product_id
                    FROM Prices
                    WHERE DATEDIFF(CURDATE(), date) < 31
            )
    ) MAXDATE
    -- join in price on that date
    INNER JOIN Prices P ON
        P.product_id = MAXDATE.product_id
        AND
        P.date = MAXDATE.date
于 2013-01-15T14:23:25.190 に答える
0

このようなものはトリックを行います:

SELECT * FROM ( 
    SELECT DISTINCT b.product_id, IF (c.min IS NULL,(SELECT ROUND(e.price,2) FROM products AS e WHERE e.product_id = b.product_id ORDER BY e.date DESC LIMIT 1 ),c.min) AS min, IF (c.date IS NULL,(SELECT f.date FROM products AS f WHERE f.product_id = b.product_id ORDER BY f.date DESC LIMIT 1 ),c.date) AS date, IF(c.min IS NULL,'<-No reg for product 2 on last month, show last reg.','<-Min price for product 1 on last month') as text FROM products AS b
    LEFT JOIN
        (SELECT a.product_id, round(MIN(a.price),2) AS min, a.date FROM products AS a WHERE a.date BETWEEN DATE_SUB(CURDATE(), INTERVAL 1 MONTH) AND CURDATE() GROUP BY a.product_id) AS c 
        ON (b.product_id = c.product_id)
    ) AS d
    ORDER BY d.text, d.product_id

出力を与えます:

product_id|min|date|text
1|8.80|2012-12-19|<-Min price for product 1 on last month
3|2.34|2012-12-24|<-Min price for product 1 on last month
2|3.45|2012-12-02|<-No reg for product 2 on last month, show last reg.
于 2013-01-15T14:42:09.223 に答える
-1

私がテストしたわけではありませんが、試すことができます...

SELECT * FROM 
  (SELECT * FROM (
      SELECT * FROM table ORDER BY date DESC)
  as tmp GROUP BY product_id) t1
LEFT JOIN
  (SELECT * FROM (
      SELECT * FROM table WHERE date => CURDATE() ORDER BY price)
  as tmp2 GROUP BY product_id) t2
ON t1.product_id = t2.product_id
于 2013-01-15T14:28:32.903 に答える