从字段名为MySql的行中检索前3个值

从字段名为MySql的行中检索前3个值,mysql,sql,Mysql,Sql,我的桌子是这样的: ID USER VALUE1 VALUE2 VALUE3 VALUE4 VALUE5 2TG Admin 20 45 10 12 24 5HT Supp 35 10 35 18 31 8PK Exc 80 62 01 38 70 1JH MANG

我的桌子是这样的:

ID    USER    VALUE1   VALUE2   VALUE3   VALUE4    VALUE5
2TG   Admin     20       45       10       12        24
5HT   Supp      35       10       35       18        31
8PK   Exc       80       62       01       38        70
1JH   MANG      48       96       21       23        36
4YT   LAW       58       50       29       58        51     
我正在使用的代码:

SELECT ID, USER,  MAX(MAX1) AS MAX, ValueName FROM ( SELECT ID, USER,Value1 AS MAX1, 'Value1' as ValueName FROM Data

UNION
SELECT ID,USER, Value2 AS MAX1, 'Value2' as ValueName
FROM Data 
UNION
SELECT ID, USER,Value3 AS MAX1, 'Value3' as ValueName
FROM Data
UNION
SELECT ID, USER,Value4 AS MAX1, 'Value4' as ValueName
FROM Data
UNION
SELECT ID, USER,Value5 AS MAX1, 'Value5' as ValueName
FROM Data) T  GROUP BY ID
使用上面描述的代码,这是我得到的输出:

ID    USER    MAX1   ValueName
2TG   Admin    45    Value1
5TH   Supp     35    Value1
8PK   Exc      80    Value1
1JH   MANG     96    Value1
4YT   LAW      58    Value1    
这将是期望的输出:

 ID    USER    MAX1   MAX2   MAX3   ValueName1  ValueName2   ValueName3
 2TG   Admin    45     24     20    Value2      Value5       Value1 
 5TH   Supp     35     35     31    Value1      Value3       Value5
 8PK   Exc      80     70     62    Value1      Value5       Value2
 1JH   MANG     96     48     36    Value2      Value1       Value5
 4YT   LAW      58     58     51    Value1      Value4       Value5
我要做的是获取行中的最大值1(最高)、最大值2(第二高)和最大值3(第三高)以及找到或属于1,2,3最大值的列的名称


任何帮助都将不胜感激。

在MySQL 8.x中,您可以执行以下操作:

with x as (
  select id, Value1 as val, 'Value1' as col from data
  union all select id, Value2, 'Value2' from data
  union all select id, Value3, 'Value3' from data
  union all select id, Value4, 'Value4' from data
  union all select id, Value5, 'Value5' from data
),
y as (
  select id, val, col,
    row_number() over (partition by id order by val desc) as rn
  from x
)
select
  d.id, d.user,
  v1.val as max1, v1.col as ValueName1,
  v2.val as max2, v2.col as ValueName2,
  v3.val as max3, v3.col as ValueName3
from data d
join (
  select y.id, y.val, y.col
  from y join data d on d.id = y.id
  where rn = 1
) v1 on v1.id = d.id
join (
  select y.id, y.val, y.col
  from y join data d on d.id = y.id
  where rn = 2
) v2 on v2.id = d.id
join (
  select y.id, y.val, y.col
  from y join data d on d.id = y.id
  where rn = 3
) v2 on v2.id = d.id

如果您可以接受稍微不同的结果格式,则可以使用
group\u concat()

实际上,您可以解析出所需的数据:

SELECT ID, USER,
       SUBSTRING_INDEX(GROUP_CONCAT(max1 ORDER BY max1 DESC), ',', 1) as max1,
       SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(max1 ORDER BY max1 DESC), ',', 2), ',', -1) as max2,
       SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(max1 ORDER BY max1 DESC), ',', 3), ',', -1) as max3,
       SUBSTRING_INDEX(GROUP_CONCAT(valuename ORDER BY max1 DESC), ',', 1) as valuename1,
       SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(valuename, ORDER BY max1 DESC), ',', 2), ',', -1) as valuename2,
       SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(valuename, ORDER BY max1 DESC), ',', 3), ',', -1) as valuename3
FROM . . .

还有另一种使用变量的方法,但如果没有窗口函数,这种方法可能是最简单的。

在MySQL 8.x中,它可能更简单。你们有什么版本?5.x或8.x?现在让我检查一下。这是5.6.28-76.1-56可以将查询的措辞改为不使用
。但是,此查询需要函数
ROW\u NUMBER()
。在MySQL 5.XI中,我真的不能想出一种方法来使用RoWixMULL(),但是由于某种原因,第二个子字符串索引不起作用,这就是它所说的。对本机函数“SUBSTRING\u INDEX”的调用中的参数计数不正确,工作得很好!非常感谢。
SELECT ID, USER,
       SUBSTRING_INDEX(GROUP_CONCAT(max1 ORDER BY max1 DESC), ',', 1) as max1,
       SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(max1 ORDER BY max1 DESC), ',', 2), ',', -1) as max2,
       SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(max1 ORDER BY max1 DESC), ',', 3), ',', -1) as max3,
       SUBSTRING_INDEX(GROUP_CONCAT(valuename ORDER BY max1 DESC), ',', 1) as valuename1,
       SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(valuename, ORDER BY max1 DESC), ',', 2), ',', -1) as valuename2,
       SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(valuename, ORDER BY max1 DESC), ',', 3), ',', -1) as valuename3
FROM . . .