0

すべての価格カテゴリ (および) と比較して、最低価格 ( ) または最高価格 ( )の製品の ID を返す高速な MySQL クエリを探しています。minmaxa, b, cd

chocolate_stockいくつかの価格カテゴリで呼び出される製品テーブルがあります。特定のカテゴリ (またはまたはまたは) から最低 ( min) または最高 ( ) の価格を受け取るのは非常に簡単です。maxabcd

id |      name       | price_a | price_b | price_c | price_d |
--------------------------------------------------------------
1  |   Chips Ahoy    |   250   |   530   |   720   |   120 
--------------------------------------------------------------
2  | Chocolate Chunk |   250   |   90    |  32.92  |   110   
--------------------------------------------------------------
3  |      Oreo       |   103   |  44.52  |   250   |   850   
--------------------------------------------------------------

価格区分はdecimal(10,2). カテゴリから最高価格を返しますが idは返さないサンプルを次に示します。

$t = 'chocolate_stock';
$arrIds = array(1, 3);

$strQuery = "SELECT id, 
             MAX(price_a) AS price_a, 
             MAX(price_b) AS price_b, 
             MAX(price_c) AS price_c, 
             MAX(price_d) AS price_d 
             FROM $t WHERE id IN(". implode(',', array_map('intval', $arrIds)) .")";

この情報を取得する最速の方法は何ですか?

4

5 に答える 5

1

最初に行うことは、データを正規化することです。後でクエリを実行しやすくするために、次のビューを作成します。

CREATE VIEW NormalT
AS
    SELECT  ID, Name, 'Price_a' AS Type, Price_a AS Price
    FROM    T
    UNION ALL
    SELECT  ID, Name, 'Price_b' AS Type, Price_b AS Price
    FROM    T
    UNION ALL
    SELECT  ID, Name, 'Price_c' AS Type, Price_c AS Price
    FROM    T
    UNION ALL
    SELECT  ID, Name, 'Price_d' AS Type, Price_d AS Price
    FROM    T;

次に、必要な形式がわかりません。各価格の最小値と最大値が必要な場合は、次を使用できます。

SELECT  mt.Type2,
        mt.Type,
        mt.Price,
        t.ID,
        t.Name
FROM    (   SELECT  Type, MIN(Price) AS Price, 'MIN' AS Type2
            FROM    NormalT
            GROUP BY Type
            UNION ALL
            SELECT  Type, MAX(Price) AS Price, 'MAX' AS Type2
            FROM    NormalT
            GROUP BY Type
        ) mt
        INNER JOIN NormalT T
            ON mt.Type = T.Type
            AND mt.Price = t.Price
ORDER BY mt.Type2, mt.Type, t.ID;

サンプルデータから次のものが出力されます。

TYPE2   TYPE        PRICE   ID  NAME
MAX     Price_a     250     1   Chips Ahoy
MAX     Price_a     250     2   Chocolate Chunk
MAX     Price_b     530     1   Chips Ahoy
MAX     Price_c     720     1   Chips Ahoy
MAX     Price_d     850     3   Oreo
MIN     Price_a     103     3   Oreo
MIN     Price_b     44.52   3   Oreo
MIN     Price_c     32.92   2   Chocolate Chunk
MIN     Price_d     110     2   Chocolate Chunk

ただし、すべての価格 (a、b、c、および d) の最小値と最大値だけである場合は、次のように使用できます。

SELECT  mt.Type2,
        t.Type,
        mt.Price,
        t.ID,
        t.Name
FROM    (   SELECT  MIN(Price) AS Price, 'MIN' AS Type2
            FROM    NormalT
            UNION ALL
            SELECT  MAX(Price) AS Price, 'MAX' AS Type2
            FROM    NormalT
        ) mt
        INNER JOIN NormalT T
            ON mt.Price = t.Price;

これは次のように出力されます:

TYPE2   TYPE    PRICE       ID  NAME
MIN     Price_c     32.92   2   Chocolate Chunk
MAX     Price_d     850     3   Oreo

SQL Fiddle の例

于 2013-05-28T13:44:59.610 に答える
-1

MAX は 1 つの値を返すため、ID を取得していません。しかし、id ではそうではありません。次のような別のクエリを使用できます。

SELECT id,MAX(price_a) FROM $t WHERE id IN (". implode(',', array_map('intval', $arrIds)).")";
SELECT id,MAX(price_b) FROM $t WHERE id IN (". implode(',', array_map('intval', $arrIds)).")";

于 2013-05-28T13:03:40.137 に答える