MySQL分组(最新的每个"组")

时间:2017-06-17 15:42:17

标签: mysql

我现在已经在这个问题上苦苦挣扎了一段时间,看起来很简单,但我无法绕过它。

我的初步查询如下

SELECT `updated`, `price`, `condition` 
FROM game_prices 
WHERE `game_id` = '1960' 
AND `source` = '0' 
AND `updated` > UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 1 YEAR)) 
ORDER BY `updated` DESC;

这给出了以下结果......

updated     price   condition
1496691650  9.89    1
1496009100  0.01    0
1494799503  5.99    1
1489881902  9.89    1
1487808171  7.66    1

完美。但是,我想要做的只是选择每个唯一"条件"的最新。条件可以是0,1或2。

确认已更新是一个unix时间戳。

所以我对初始查询的结果执行了一个子查询...

SELECT `updated`, `price`, `condition` 
FROM ( 
        SELECT `updated`, `price`, `condition` 
        FROM game_prices 
        WHERE `game_id` = '1960' 
        AND `source` = '0' 
        AND `updated` > UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 1 YEAR)) 
        ORDER BY `updated` DESC 
    ) AS sub 
GROUP BY `condition` 
ORDER BY `price` ASC;

在我脑海中,这应该有效,但我得到以下结果......

updated     price   condition
1496009100  0.01    0
1487808171  7.66    1

正如您所看到的,它正在为每个"条件"选择最早的记录。我在这里做错了什么?

2 个答案:

答案 0 :(得分:1)

一种方法使用相关子查询:

SELECT gp.*
FROM game_prices gp
WHERE game_id = '1960' AND
      source = '0' AND
      updated > UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 1 YEAR) AND
      updated = (SELECT MAX(gp2.updated)
                 FROM game_prices gp2
                 WHERE gp2.game_id = gp.game_id AND
                       gp2.source = gp.source AND
                       gp2.condition = gp.condition AND
                       gp2.updated > UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 1 YEAR))
                )
ORDER BY `updated` DESC;

答案 1 :(得分:1)

这是没有子查询的另一种方式

SELECT MAX(`updated`), SUBSTRING_INDEX(GROUP_CONCAT(`price` ORDER BY updated DESC),',',1), `condition` 
FROM game_prices 
WHERE `game_id` = '1960' 
AND `source` = '0' 
AND `updated` > UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 1 YEAR)) 
GROUP BY `condition`
ORDER BY SUBSTRING_INDEX(GROUP_CONCAT(`price` ORDER BY updated DESC),',',1) ;

关于您的上一次查询,您的2列中没有聚合条件而不是GROUP BY,因此您获得不确定的值(随机)