MySQL : select 一行中具有最大值的 3 个列名

MySQL : select 3 column names with greatest values from a row

我是 MySQL 的新手,遇到以下问题:

我需要 select 3 个具有最大值的列名称,而我的 "countries" table 的结构如下:

countryCode   tag1   tag2   tag3   tag4   tag5   tag6   tag7   tag8

     GB        2      4      4       8      9      1      1     0 
     .
     .
     .

所以在这种情况下查询应该return tag5, tag4, tag3。 我把selectmax和union弄乱了,还没成功。

感谢任何帮助:)

进一步说明

countryCode backpack beach culture forest mountains scuba trailer
   AD          0       5      85     1       5        6      7  
   AE          7       2      15     1       9        6      7 
   .
   .
   .

我从PHP查询,国家代码为Post。我需要获得具有最高 3 个数字的列的结果。对于这个例子;如果我查询 AD,它应该 return culture, trailer, scuba

我不确定我是否完全理解你的问题,所以我添加了一点 - 假设我有这样的输入:

countryCode   tag1   tag2   tag3   tag4   tag5   tag6   tag7   tag8

     GB        2      4      5       8      9      1      1     0 
     FR        9      4      4       8      9      1      7     0 
     .
     .

那么您希望输出为: 国家代码 number1 number2 number3

     GB        tag5           tag4      tag3       
     FR        tag1, tag5     tag4      tag7

?

如果您希望得到上述结果,max 将无济于事,您的数据格式也无济于事。你可能会做类似下面的事情,这很糟糕......

select countryCode, tagName, value from 
(select a.countryCode, 'tag1'  tagName, a.tag1  value from countries a where a.countryCode = 'GB' UNION
select  b.countryCode, 'tag2'  tagName, b.tag2  value from countries b where b.countryCode = 'GB' UNION
select  c.countryCode, 'tag3'  tagName, c.tag3  value from countries c where c.countryCode = 'GB' UNION
select  d.countryCode, 'tag4'  tagName, d.tag4  value from countries d where d.countryCode = 'GB' UNION
select  e.countryCode, 'tag5'  tagName, e.tag5  value from countries e where e.countryCode = 'GB' UNION
select  f.countryCode, 'tag6'  tagName, f.tag6  value from countries f where f.countryCode = 'GB' UNION
select  g.countryCode, 'tag7'  tagName, g.tag7  value from countries g where g.countryCode = 'GB' UNION
select  h.countryCode, 'tag8'  tagName, h.tag8  value from countries h where h.countryCode = 'GB' UNION
select  i.countryCode, 'tag9'  tagName, i.tag9  value from countries i where i.countryCode = 'GB' UNION
select  j.countryCode, 'tag10' tagName, j.tag10 value from countries j where j.countryCode = 'GB' ) 
as results
order by value desc
limit 3;

编辑:只是我得到的数据和 table 结构的示例。我在 MySQL 5.5.44-0ubuntu0.12.04.1 中 运行 这个,以防这是版本差异。因此,如果您调整上面的示例查询,那应该会起作用。

mysql> desc countries;
+-------------+------------+------+-----+---------+-------+
| Field       | Type       | Null | Key | Default | Extra |
+-------------+------------+------+-----+---------+-------+
| countryCode | varchar(2) | YES  |     | NULL    |       |
| tag1        | int(11)    | YES  |     | NULL    |       |
| tag2        | int(11)    | YES  |     | NULL    |       |
| tag3        | int(11)    | YES  |     | NULL    |       |
| tag4        | int(11)    | YES  |     | NULL    |       |
| tag5        | int(11)    | YES  |     | NULL    |       |
| tag6        | int(11)    | YES  |     | NULL    |       |
| tag7        | int(11)    | YES  |     | NULL    |       |
| tag8        | int(11)    | YES  |     | NULL    |       |
| tag9        | int(11)    | YES  |     | NULL    |       |
| tag10       | int(11)    | YES  |     | NULL    |       |
+-------------+------------+------+-----+---------+-------+
11 rows in set (0.00 sec)

mysql> select * from countries;
+-------------+------+------+------+------+------+------+------+------+------+-------+
| countryCode | tag1 | tag2 | tag3 | tag4 | tag5 | tag6 | tag7 | tag8 | tag9 | tag10 |
+-------------+------+------+------+------+------+------+------+------+------+-------+
| GB          |    5 |    1 |    2 |    5 |    7 |    8 |    9 |    3 |   15 |    22 |
| FR          |    5 |   14 |    2 |    5 |    7 |    8 |    9 |    3 |   15 |    22 |
+-------------+------+------+------+------+------+------+------+------+------+-------+
2 rows in set (0.00 sec)

理想情况下,如果您从其他地方获取此数据,可能更容易也更推荐使用其他 table,因为我发送给您的查询会很慢。

理想情况是您有一个 table 国家代码和标签,您可以直接在其上使用聚合函数。