【问题标题】:Mysql max value from 3 different columns来自3个不同列的Mysql最大值
【发布时间】:2013-07-24 22:01:09
【问题描述】:

有没有办法找到 3 个不同列的最大值?我正在尝试查找任何 3 列值高于指定值的记录,并试图避免在查询中做出这样的事情:

column1 > 69 or column2 > 69 or column3 > 69

表结构是这样的:

id | column1 | column2 | column3
1  |   5     |    4    |    3
2  |  70     |    1    |    65
3  |  66     |    3    |    90

然后像这样选择:

select id from tablex where column1 > 69 or column2 > 69 or column3 > 69

-- but with better query, a bit prettier like this (it doesn't work of course)

select id from tablex where MAX(column1, column2, column3) > 69

【问题讨论】:

  • RE:尽量避免做出这样的事情 为什么?它不是很长或很神秘。虽然一个衬垫很好,但如果它们都产生相同的结果,则性能更为重要。在选择方法之前,您可能需要检查查询计划。如果它们相同(我不知道它们是否相同),请选择您喜欢的那个。否则,我会使用更有效的语法。
  • 是的,但这仍然是一个简单的一次性脚本,将不时使用。比性能本身更重要的是逻辑结构和可读性;)
  • 啊,好吧。我没有意识到这是一次性的。在这种情况下,我同意性能不那么重要。如果您确实有机会查看查询计划,请告诉我们 ;-) 如果有任何区别,我会很好奇。
  • @Leigh,OR 查询更有可能使用索引。
  • @ypercube - 啊,好的,谢谢。我想我并不感到惊讶,因为将函数应用于过滤列通常会阻止数据库使用索引。

标签: mysql sql max


【解决方案1】:

你需要使用GREATEST

这样

    select id from tablex where GREATEST(column1, column2, column3) > 69

【讨论】:

  • 真的...我在同一时间得到了这个答案 :) 谢谢!
【解决方案2】:

我想指出:

where GREATEST(column1, column2, column3) > 69;

等同于:

where column1 > 69 or column2 > 69 or column3 > 69;

第一个将过滤掉三列中任何一列为NULL 的所有行。第二个仍然会考虑这些行。您可以将GREATEST() 查询重写为:

where GREATEST(coalesce(column1, 0), coalesce(column2, 0), coalesce(column3, 0)) > 69;

但这违背了更简单语法的目的。您可能知道列值永远不会是NULL,在这种情况下使用greatest() 是可以的。但是,它不是一般的替代品。

【讨论】:

  • 好地方。我没有意识到greatest 包含空值。 (虽然完全有道理。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-23
  • 2019-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多