2012-06-13 2 views
0

У меня есть SQL-запрос, как это:MySQL MIN и MAX функции с, если заявление

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 

Как я получить минимальные и максимальные значения без использования повторяющегося кода, если заявление?

Спасибо.

ответ

2

Enclose расчет 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 ...) > 0 на EXISTS (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 ; 
+0

проблема решена, благодаря и. – uint

Смежные вопросы