0

私はこのようなSQLクエリを持っています:

SELECT IF( (SELECT COUNT(*) FROM `test_table2` WHERE `id` = t.`id`) > 0,
    (t.`price` + (SELECT `price` FROM `attribute` WHERE `id` = t.`id` LIMIT 1)),
    t.`price`
) AS `full_price`, 
MIN(`full_price`) as `min`, MAX(`full_price`) as `max` 
FROM `test_table` t

ifステートメントで重複コードを使用せずに最小値と最大値を取得するにはどうすればよいですか?

ありがとう。

4

1 に答える 1

3

full_priceの計算をサブクエリで囲みます。

SELECT 
      MIN(full_price) AS min_full
    , MAX(full_price) AS max_full
FROM
  ( SELECT IF( (SELECT COUNT(*) FROM test_table2 WHERE id = t.id) > 0
             , t.price + (SELECT price FROM attribute WHERE id = t.id LIMIT 1)
             , t.price
             ) AS full_price  
    FROM test_table AS t
    WHERE ...                 --- if you want conditions applied to `test_table`
                              --- before calculating the `full_price`
  ) AS tmp ;

改善点:

  • (標準SQL):CASE句を使用IFします。これはMySQL専用ではありません。
  • (パフォーマンス):をに変更(SELECT COUNT ...) > 0EXISTS (SELECT ... )ます。通常は高速です。

クエリは次のようになります。

SELECT 
      MIN(full_price) AS min_full
    , MAX(full_price) AS max_full
FROM
  ( SELECT 
        CASE WHEN 
               EXISTS (SELECT * FROM test_table2 WHERE id = t.id) 
             THEN t.price + (SELECT price FROM attribute WHERE id = t.id LIMIT 1)
             ELSE t.price
        END AS full_price  
    FROM test_table AS t
    WHERE ... 
  ) AS tmp ;
于 2012-06-13T23:30:46.723 に答える