简体   繁体   English

mysql MIN和MAX函数用if语句

[英]mysql MIN and MAX functions with if statement

I have an sql query like this: 我有这样的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

How can i retrieve min and max values without using duplicate code in if statement? 如何在不使用if语句中的重复代码的情况下检索最小值和最大值?

Thanks. 谢谢。

Enclose the calculation of full_price in a subquery: 在子查询中包含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 ;

Improvements: 改进:

  • (standard SQL): use CASE clause and not IF which is only for MySQL. (标准SQL):使用CASE子句而不是仅用于MySQL的IF
  • (performance): change the (SELECT COUNT ...) > 0 to EXISTS (SELECT ... ) . (性能):将(SELECT COUNT ...) > 0改为EXISTS (SELECT ... ) It's usually faster. 它通常更快。

Your query would become: 您的查询将变为:

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 ;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM