Если вы можете принять немного другой формат результата, вы можете использовать group_concat()
:
SELECT ID, USER,
SUBSTRING_INDEX(GROUP_CONCAT(max1 ORDER BY max1 DESC) , ',', 3) as Top3_names,
SUBSTRING_INDEX(GROUP_CONCAT(ValueName ORDER BY max1 DESC) , ',', 3) as Top3_names,
FROM (SELECT ID, USER, Value1 AS MAX1, 'Value1' as ValueName FROM Data
UNION ALL
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;
На самом деле, вы можете затем проанализировать нужные данные:
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 . . .
Есть другой метод, использующий переменные, но этот метод, вероятно, самый простой, если у вас нет оконных функций.