更容易根据条件选择MAX()?

时间:2010-07-07 02:42:27

标签: sql mysql

给出以下表格格式......

id | date       | value
___|____________|______
11 | 2010-01-01 | 50
11 | 2010-01-02 | 100
12 | 2010-01-01 | 150
12 | 2010-01-02 | 200

...我需要选择与我指定的日期最大id对应的value。到目前为止,我弄清楚如何执行此操作的唯一方法是使用子查询,如下所示:

SELECT id
    FROM table
    WHERE date =  '2010-01-01'
        AND value = ( 
            SELECT MAX(value)
                FROM table
                WHERE date = '2010-01-01'
                GROUP BY date
        )

在一个包含约70,000条记录的表上,主键超过iddate,这需要大约0.25秒才能执行,这对我来说似乎很长一段时间。我有更快的方法来获得相同的结果吗?

感谢。

4 个答案:

答案 0 :(得分:3)

SELECT TOP 1 id FROM table WHERE date = '2010-01-01' ORDER BY value DESC

答案 1 :(得分:1)

MySQL对从GROUP BY查询中获得的内容变得非常宽容 - 这意味着它不必只是聚合或GROUP BY列。你应该没问题PRIMARY KEY看看下面给你的内容。

SELECT id, MAX(value) FROM table WHERE date = '2010-01-01' GROUP BY date;

答案 2 :(得分:1)

尝试使用JOIN?

SELECT 
     A.id 
FROM 
     table A
     JOIN (SELECT MAX(value) as m_value
        FROM table 
        WHERE date = '2010-01-01') AS B ON A.value = B.m_value
WHERE 
     A.date =  '2010-01-01'

答案 3 :(得分:1)

答案集合


输入一次日期:

SELECT id
FROM   table
WHERE  (date,value) IN ( select date, max(value) 
                         from   table
                         where  date = '2010-01-01'
                         group by date
                       )


日期两次,没有分组依据(首选方法):

SELECT id
FROM   table
WHERE  date  = '2010-01-01'
  AND  value = ( select max(value)
                  from   table
                  where  date = '2010-01-01'
                )


思想


  • 第二个应该是最快的。
  • FROM语句中执行连接的任何查询都等同于WHERE子句中的子查询。
  • 使用LIMIT/TOP 1的任何查询都可能无法返回完整的结果集,这会根据您的要求对您的应用程序产生负面影响 - 您可能需要所有ID
  • 提高速度的其他方法:
    1. 创建存储过程
    2. 在(日期,价值)上创建索引 ID在这种情况下不需要索引