按三个不同列中的最大值排序

时间:2010-09-26 02:49:32

标签: mysql

我甚至不确定是否可以这样做,但我想根据三列中的一列的最大值来订购查询。

示例表结构: guid,column1,column2,column3

第1-3列有数值,我想根据最大值1,2或3对select语句进行排序。

例如:

record column1  column2  column3    
---------------------------------
1      5        0        2
2      2        0        6
3      0        1        2

将命令记录2,1,3,因为6是三个记录中三个字段的最大值,记录1是第二个,记录3是第三个。

这有意义吗?

感谢。

3 个答案:

答案 0 :(得分:3)

可能可以在选择查询中执行(可能使用类似case when的内容,但我不确定order by子句本身是否允许,YMMV取决于在DBMS上)但是如果你希望你的数据库随着桌子越来越大而扩展(“在赛马中没有单腿猪的表现”,那么使用每行计算很少是一个好主意,作为我们的一个DBA雄辩地说出来。)

在这种情况下,我设置了一个额外的(索引的)列来保持最大值并确保通过使用插入/更新触发器来强制保持数据完整性,以强制该新列到其他三个列的最大值。 / p>

因为大多数数据库表的读取频率远高于写入数据库,所以这会在所有读取中分摊计算成本。只有在您更新数据并且查询变得非常快时才会承担成本,因为您在单个索引列上进行了订购:

select f1, f2, f3 from t order by fmax desc;

答案 1 :(得分:1)

如上所述here,你想要的是GREATEST功能的等价物。

如果没有,假设您已定义UDF LargerOf以返回两个数字中的最大值,请使用

SELECT *
FROM Table
ORDER BY LargerOf(LargerOf(column1, column2), column3)

答案 2 :(得分:1)

create table myTable
(column1 int, column2 int, column3 int)
go


insert into myTable
values (5, 0 , 2)
go

insert into myTable
values (2, 0 , 6)
go

insert into myTable
values (0, 1 , 2)
go


select *
from mytable
order by case when column1 > column2 and column1 > column3 then column1
when column2 > column3 then column2
else column3 end desc