我现在已经在这个问题上苦苦挣扎了一段时间,看起来很简单,但我无法绕过它。
我的初步查询如下
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
正如您所看到的,它正在为每个"条件"选择最早的记录。我在这里做错了什么?
答案 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,因此您获得不确定的值(随机)