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 国家代码和标签,您可以直接在其上使用聚合函数。
我是 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 国家代码和标签,您可以直接在其上使用聚合函数。