如何在where子句中获取每个名称的最新值?

时间:2016-01-12 15:55:56

标签: mysql group-by

我如何才能获得每个名字的最新值。

SQL="SELECT name,Myvalue,theDate from Mytable where name in ('name1','name2','name3')";

因此案例中的结果仅为3条记录。 Primery Key:AutoInc。 theDate:值的日期。

1 个答案:

答案 0 :(得分:1)

使用变量在mysql中创建row_number

因为数据是订单by DATE DESC,所以带有rownum = 1的行会返回每个名称的最新内容

<强> SQL FIDDLE DEMO

测试数据

INSERT INTO ForgeRock
    (`name`, `Myvalue`, `theDate`)
VALUES
    ('name1', 1, '2016/01/10'),
    ('name1', 7, '2016/01/11'),
    ('name1', 6, '2016/01/12'),  <-- latest
    ('name2', 2, '2016/01/03'),  <-- latest
    ('name2', 5, '2016/01/02'),
    ('name2', 3, '2016/01/01'),
    ('name3', 30, '2016/01/05'),
    ('name3', 12, '2016/01/06'),
    ('name3', 33, '2016/01/07')  <-- latest
;

QUERY

SELECT name,
       Myvalue,
       theDate
FROM
    (  
        SELECT name,
               Myvalue,
               theDate,
               (@rownum := if(@name = name,
                              @rownum + 1,  -- increase rownum 
                              if (@name := name, -- reset counter
                                  1,
                                  1)
                             )
                ) rownum
        FROM ForgeRock 
        CROSS JOIN (select @rownum := 1, @name := '') params  -- initialize the variables
        WHERE name in ('name1','name2','name3')
        ORDER BY name, theDate desc
     ) T
WHERE rownum = 1
ORDER BY name

<强>输出

|  name | Myvalue |                   theDate |
|-------|---------|---------------------------|
| name1 |       6 | January, 12 2016 00:00:00 |
| name2 |       2 | January, 03 2016 00:00:00 |
| name3 |      33 | January, 07 2016 00:00:00 |