gpt4 book ai didi

mysql - 选择多列的 max()

转载 作者:IT老高 更新时间:2023-10-29 00:12:12 24 4
gpt4 key购买 nike

好的,这是我的 table :

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,对吗? Wat 如果我们有这些值:

  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 帮不上什么忙。如果你认为会,请证明我错了。

最佳答案

这是唯一标识符派上用场的一个例子。

假设您有一个自动递增的 ID 字段,然后您可以使用相关的子查询为每个产品找到所需的 ID...

SELECT
*
FROM
yourTable
WHERE
id = (
SELECT id
FROM yourTable AS lookup
WHERE lookup.product_id = yourTable.product_id
ORDER BY version_id DESC, update_id DESC, patch_id DESC
LIMIT 1
)


等价的没有唯一标识符需要多个相关的子查询...

SELECT
*
FROM
yourTable
WHERE
version_id = (
SELECT MAX(version_id)
FROM yourTable AS lookup
WHERE lookup.product_id = yourTable.product_id
)
AND update_id = (
SELECT MAX(update_id)
FROM yourTable AS lookup
WHERE lookup.product_id = yourTable.product_id
AND lookup.version_id = yourTable.version_id
)
AND patch_id = (
SELECT MAX(patch_id)
FROM yourTable AS lookup
WHERE lookup.product_id = yourTable.product_id
AND lookup.version_id = yourTable.version_id
AND lookup.update_id = yourTable.update_id
)

这将比在具有唯一标识符列的表上慢得多。


另一种选择(没有唯一标识符)是在不同的聚合级别上自联接。

SELECT
yourTable.*
FROM
(SELECT product_id, MAX(version_id) AS max_version_id FROM yourTable GROUP BY product_id) AS version
INNER JOIN
(SELECT product_id, version_id, MAX(update_id) AS max_update_id FROM yourTable GROUP BY product_id, version_id) AS update
ON update.product_id = version.product_id
AND update.version_id = version.max_version_id
INNER JOIN
(SELECT product_id, version_id, updatE_id, MAX(patch_id) AS max_patch_id FROM yourTable GROUP BY product_id, version_id) AS patch
ON patch.product_id = update.product_id
AND patch.version_id = update.version_id
AND patch.update_id = update.max_update_id
INNER JOIN
yourTable
ON yourTable.product_id = patch.product_id
AND yourTable.version_id = patch.version_id
AND yourTable.update_id = patch.update_id
AND yourTable.patch_id = patch.max_patch_id

关于mysql - 选择多列的 max(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8508608/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com