3

次のテーブルがあります。

+----+-------+-------+-----------+-----------+--------------+--------------+
| id | stock | price | usedStock | usedPrice | specialStock | specialPrice |
+----+-------+-------+-----------+-----------+--------------+--------------+
| #1 |     1 | 10.00 |         0 | 0         |            0 | 0            |
| #2 |     0 | 0     |         1 | 15.00     |            1 | 20.00        |
| #3 |     0 | 0     |         0 | 11.00     |            1 | 14.00        |
+----+-------+-------+-----------+-----------+--------------+--------------+

商品の種類が在庫がある場合、最初に最低価格で注文するクエリを作成したいと思います。

したがって、クエリは次の順序になります。

#1 - 10.00 (because 10.00 is the lowest result)
#3 - 14.00 (because although 11.00 is less, it's not in stock)
#2 - 15.00 (because 15.00 is lower than 20.00)

テーブルを選択した後に PHP を使用して計算するより迅速な方法がある場合に備えて、この質問に PHP タグを追加しました。

4

3 に答える 3

0

最初にビューを作成します

CREATE VIEW stock_min_price AS
SELECT id, LEAST(IF(stock > 0, price, 1000000000),
    IF (usedStock > 0, usedPrice, 10000000000),
    IF (specialStock > 0, specialPrice, 10000000000)) AS actualPrice
FROM tablename;

次に、すべてのアイテムの実際の価格で選択して注文します

SELECT id, IF(actualPrice = 1000000000, NULL, actualPrice) AS price
FROM stock_min_price
ORDER BY actualPrice

//編集: 在庫が 1 より大きい場合に > 0 と比較

于 2013-02-03T22:52:45.270 に答える
0

商品が在庫にある場合は、最低価格で注文します。

ORDER BY
  LEAST(CASE WHEN stock        THEN price        ELSE GREATEST(price, usedPrice, specialPrice) END,
        CASE WHEN usedStock    THEN usedPrice    ELSE GREATEST(price, usedPrice, specialPrice) END,
        CASE WHEN specialStock THEN specialPrice ELSE GREATEST(price, usedPrice, specialPrice) END)

条件が true (>=1) の場合、各 CASE WHEN は価格を返します。それ以外の場合は、最大の価格を返します。ここでフィドル。

于 2013-02-03T22:58:48.853 に答える
0

率直に言って、まさにこの種の操作については、データ モデリングを再考する必要があります。3 種類の在庫の間に直接的な関係はないため、別のテーブルに正規化する必要があります。このために、古いテーブルの名前がoldTableであると仮定します

    CREATE TABLE stock(item_id integer, amount integer, price double, type enum('normal', 'used', 'special'));

    INSERT INTO stock SELECT o.id, o.stock, o.price,'normal' FROM _oldTable as o 
    WHERE o.stock >0 OR o.amount >0 ;

    INSERT INTO stock SELECT o.id, o.usedStock, o.usedPrice, 'used' FROM _oldTable as o
    WHERE o.stock >0 OR o.amount >0 ;

    INSERT INTO stock SELECT o.id, o.specialStock, o.specialPrice,'special' FROM _oldTable as o
    WHERE o.stock >0 OR o.amount >0 ;

そして、あなたはそれを持っています。joinご覧のとおり、基本的に在庫テーブルで簡単に情報を取得できます。

    SELECT o.id, s.kind, min(s.price) FROM _oldTable_ AS o 
    JOIN stock as s ON s.item_id = o.id AND s.amount > 0
    GROUP BY s.item_id

元のテーブルのような出力を生成する場合は、次を使用します。

    SELECT o.id, n.amount as amount, n.price as price, u.amount as usedAmount, u.price as usedPrice, s.amount as specialAmount, s.price as specialPrice
    FROM _oldTable_ AS o 
    LEFT JOIN stock as n ON n.item_id = o.id AND n.type = 'normal'
    LEFT JOIN stock as u ON u.item_id = o.id AND n.type = 'used'
    LEFT JOIN stock as s ON s.item_id = o.id AND n.type = 'special';

また、a) 各在庫の合計金額 ( GROUP BYitem_id のステートメントを含む金額列の合計) を取得することもより簡単になりました。b) 使用されている在庫の種類を取得します。

item_idps:アイテムがたくさんある場合は、おそらく列にインデックスを設定する必要があります。また、このソリューションは、すべてのアイテムにすべての種類の在庫があるわけではない場合、ディスク容量を節約できる可能性があることに注意してください

于 2013-02-04T01:15:15.637 に答える