如何选择列值最大的记录

时间:2014-08-15 16:28:28

标签: mysql sql

列:numberIWant,value

我想获得numberIWant个最有价值的记录。

select max(value) from myTable

仅返回最大值。

我想找到numberIWant有这个' max'值。怎么做?

3 个答案:

答案 0 :(得分:1)

使用GROUP_CONCAT,如下所示:

SELECT 
  MAX(value),
  SUBSTRING_INDEX(
    GROUP_CONCAT(numberIWant ORDER BY value DESC),
    ',', 1
  )
FROM
  my_table

很多此类查询实际上并不需要自我加入,只需要一个SELECT即可满足。

答案 1 :(得分:0)

下面的SQL中显示了一种可能更简单的Rolando方法。至于哪个更好很难说,因为表现可能会根据您的具体情况而有所不同。根据表的大小,性能会根据您的PRIMARY KEY和索引而有所不同。我无法使用真实的数据集进行测试,因此该领域的任何测试都取决于您。

如果值(我称之为myvalue)是UNIQUE(而非NULL),那么你不需要输入IN而just =将会这样做。这应该更高效。如果myvalue是PRIMARY KEY,它应该更快。

顺便说一句,欢迎来到论坛!下次,你能给我们DDL(CREATE TABLE blah(col1 col1_type,col2 ...)和一些DML(INSERT INTO blah VALUES(col1_value,col2_value ...);)。这使那些试图帮助你的人更容易为我们的答案创建测试用例。

此论坛是一个很好的资源,所以请帮助我们帮助您查看有关如何提出重大问题的帖子here(及其中的链接)。

CREATE TABLE `numwant` 
(
  `numiwant` int(11) DEFAULT NULL,
  `myvalue` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

mysql> SELECT * FROM numwant;
+----------+---------+
| numiwant | myvalue |
+----------+---------+
|        2 |       5 |
|        3 |     456 |
|        4 |      55 |
|        4 |     456 |
+----------+---------+
4 rows in set (0.00 sec)

mysql> 

mysql> SELECT n.* FROM numwant n WHERE n.myvalue IN (SELECT MAX(myvalue) FROM numwant);
+----------+---------+
| numiwant | myvalue |
+----------+---------+
|        3 |     456 |
|        4 |     456 |
+----------+---------+

答案 2 :(得分:0)

Shlomi的工作。 Verace不适用于我的问题,在我的情况下我不能用'value'来找'numwant'

我发现了另一个(也很容易)答案:

SELECT numIWant
FROM myTable
ORDER BY value DESC
LIMIT 1

但我从未见过是否有人使用这样的声明,是错还是在某些情况下表现不佳?或者我每次都可以使用它吗?