【发布时间】:2011-12-14 17:06:23
【问题描述】:
好的,这是我的桌子:
product_id version_id update_id patch_id
1 1 0 0
1 1 1 0
1 1 1 1
1 1 2 0
1 1 2 1
2 1 0 0
2 2 0 0
2 3 0 0
2 3 0 1
3 1 0 0
3 1 0 1
现在我想选择一个产品的最新版本,所以是update_id和patch_id最高的版本。
例如最新版本
- 产品 1 应返回 1、2、1
- 产品 2 应该返回 3, 0, 1
- 产品 3 应返回 1、0、1
我尝试了各种使用 GROUP BY 和 HAVING 的东西,尝试了子查询,但我仍然无法找到实现此目的的方法。
谁能帮我找到正确的查询,或者我应该考虑为此编写一个 php 函数吗?
编辑
一些附加信息: - 列在一起是主键(有更多列,但对于这个问题,它们无关紧要) - 没有一列是自动递增的
这是桌子:
CREATE TABLE IF NOT EXISTS `db`.`patch` (
`product_id` INT NOT NULL ,
`version_id` INT NOT NULL ,
`update_id` INT NOT NULL ,
`patch_id` INT NOT NULL
PRIMARY KEY (`product_id`, `version_id`, `update_id`, `patch_id`) ,
INDEX `fk_patch_update1` (`product_id` ASC, `version_id` ASC, `update_id` ASC) )
编辑 2
标记为重复,但不是:另一个问题查找高于三个不同列中任何一个值的记录。
在这个问题中,我们查找按 product_id 分组的最高版本号。
编辑 3
rgz 的回答再次告诉我这是重复的。首先:这个问题比较老。其次,我不认为答案是一样的。
rgz 建议使用以下查询:
SELECT product_id, GREATEST(version_id, update_id, patch_id) AS latest_version FROM patch.
GREATEST(1,2,3) 返回 3,对吗?如果我们有这些值:
product_id version_id update_id patch_id
1 1 0 0
1 1 2 8
1 3 0 0
据我了解,此查询将返回:
product_id latest_version
1 1
1 8
1 3
但它应该返回:
product_id version_id update_id patch_id
1 3 0 0
我不认为 GREATEST 可以提供帮助。如果你认为会,请证明我错了。
【问题讨论】:
-
我知道这是一个老问题,但你也可以这样做:SELECT * FROM db.patch ORDER BY UPDATE_ID DESC, PATCH_ID DESC LIMIT 1;
-
@rgz 这不是重复的。查看我的编辑。
-
澄清一下,返回行的条件是每个product_id的最高version_id的最高update_id的最高patch_id吗?
-
是的,就是这个条件。