mysql - 从多列中选择 3 个最小值

标签 mysql

ID COL1 COL2 COL3 COL4 COL5 COL6 COL7
-------------------------------------
1   4    13   8    0    9    11   2
2   12   3    3    10   17   12   9
3   17   0    0    19   3    1    3
4   5    0    16   0    9    11   2

这是一个示例数据表。

我需要做的是选择并标记每行中的三个最小值,以便我可以识别每个值。

例如,我想知道 Row2 中的三个最小值是 3,3,9,并且它们位于 COL2,COL3,COL7

我想我需要合并mysql中提供的LEAST()命令,但它似乎只返回一个值(最小的一个)。

SELECT LEAST(COL1,COL2,COL3,COL4,COL5,COL6,COL7)

我似乎不知道如何获得 3 个最小值,而不是只有一个。

最佳答案

不幸的是你的表没有标准化:(

在这种情况下,可能的解决方案是使用如下查询对表进行逆透视:

CREATE VIEW unpivoted AS
SELECT id, 'col1' colname, col1 as value FROM Table1
UNION ALL
SELECT id, 'col2' colname, col2 FROM Table1
UNION ALL
SELECT id, 'col3' colname, col3 FROM Table1
UNION ALL
SELECT id, 'col4' colname, col4 FROM Table1
UNION ALL
SELECT id, 'col5' colname, col5 FROM Table1
UNION ALL
SELECT id, 'col6' colname, col6 FROM Table1
UNION ALL
SELECT id, 'col7' colname, col7 FROM Table1

然后使用如下所示的查询来查找 3 个最小值,然后将结果转回原处:

SET @x = 0;
Set @lastid = -999;

SELECT id,
       min( IF( x = 0, colname, null )) As Colname1,
       min( IF( x = 0, value, null )) As value1,
       min( IF( x = 1, colname, null )) As Colname2,
       min( IF( x = 1, value, null )) As value2,
       min( IF( x = 2, colname, null )) As Colname3,
       min( IF( x = 2, value, null )) As value3
FROM (
  SELECT id, colname, value,
         IF( @lastid = id, @x:=@x+1,
             IF( (@lastid:=id), @x:=0, @x:=0 ) 
         ) As x
  FROM unpivoted
  ORDER BY id, value
) q
WHERE x < 3
GROUP BY id

演示:http://sqlfiddle.com/#!2/f20ee4/5
但这些查询的速度会非常慢,甚至不要在大表上尝试它们。
您需要规范化表格。

关于mysql - 从多列中选择 3 个最小值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27346050/

相关文章:

mysql - 我如何查询拆分为 2 个较小表的表?联盟?看法?

mysql查询问题

c# - 用于 ASP.NET 和 Java 的共享 MySQL 数据库

mysql - 选择两个表并按日期排序

mysql - 如何选择两个不同表字段的乘积和指定其他两个字段的值?

mysql - 如何使用 DBI 连接到远程 mysql 服务器?

php - 更新 mysql 中可能追加或更改其名称的列上的重复行

mysql - 使用MySQL计算结果中所有经纬度距离

mysql - 将自定义外键分配给 Rails Junction 表

php/mysql搜索查询语法