0

我有下表:Tree。我正在尝试为每个场景ID 选择最高的主键 ID

id  user_id  scenario_id
----------------------------------
100   1        10
200   1        10
300   1        5
400   1        5
500   1        5


SELECT * FROM tree 
WHERE user_id = 1
GROUP BY scenario_id
ORDER BY id DESC

通过上面的查询,我没有得到最大的 ID。我得到300 和 100 - 但我想得到200 和 500。这是要测试的表转储:

CREATE TABLE IF NOT EXISTS `tree` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) DEFAULT NULL,
  `scenario_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;

INSERT INTO `tree` (`id`, `user_id`, `scenario_id`) VALUES
    (5, 1, 5),
    (100, 1, 10),
    (200, 1, 10),
    (300, 1, 5),
    (400, 1, 5),
    (500, 1, 5);
4

2 回答 2

2

如果您想保留您的选择 * 并避免分组以从同一记录中获取这些结果,您也可以使用自联接:

SELECT t1.* 
FROM 
tree t1 LEFT JOIN tree t2 ON t1.scenario_id = t2.scenario_id AND t2.id > t1.id
WHERE 
t2.id IS NULL;

有时,这对于提取使用 group by/aggregate 解决方案无法有效获取的其他字段可能很有用。

于 2013-10-22T17:25:30.280 回答
2

使用聚合函数获取组的特定值

SELECT scenario_id, max(id) as max_id
FROM tree 
WHERE user_id = 1
GROUP BY scenario_id
于 2013-10-22T16:07:47.523 回答