mysql - 从列中选择最大值并从另一列中选择相应的值

标签 mysql sql greatest-n-per-group

这可能是一个相对简单的问题,但我正在努力解决它。我有下面列出的三个表(owners、pets、petTypes),并尝试在一个查询中提取以下数据。前两个并不难,但第三个和第四个是我遇到困难的地方。

如果要复制表数据:https://pastebin.com/veXHwcMc

问题:

  1. 所有者 ID

  2. 所有者姓名

  3. 主人宠物的最大年龄
  4. 主人最古老的宠物类型名称
  5. 其他宠物的数量

我尝试过的

选择最大的年龄SELECT MAX(age) FROM pets

连接表格以显示SELECT pets.ownerId, MAX(pets.age), petTypes.name FROM pets INNER JOIN petTypes ON pets.petTypeId = petTypes.id GROUP BY pets.ownerId;

但这是错误的。因为当他们应该显示最老的猫的正确名字时,他们都显示了猫。

我想到了这个问题:How can I SELECT rows with MAX(Column value), DISTINCT by another column in SQL?

所以我尝试:SELECT petTypes.id, petTypes.name FROM petTypes INNER JOIN (SELECT MAX(age) FROM pets GROUP BY OwnerId) pets ON petTypes.id = pets.petTypeId;

但抛出的错误是ERROR 1054 (42S22): Unknown columns 'petTypes.id' in 'on Clause'

请帮忙

tables + the data

最佳答案

Working demo:

SELECT O.ID, O.FirstName, O.LastName, P.Age, min(PT.Name) as TypeName, OPets.CntOfOtherPets
FROM Owners O
INNER JOIN (SELECT OwnerID, max(Age) MA, count(*)-1 as CntOfOtherPets 
            FROM Pets 
            GROUP BY OwnerID) OPets
 on  OPets.OwnerID = O.ID
INNER JOIN Pets P
 on P.Age = OPets.MA
and P.OwnerID = OPets.OwnerID
INNER JOIN PetTypes PT
 on P.PetTypeID = PT.ID
GROUP BY  O.ID, O.FirstName, O.LastName, P.Age, OPets.CntOfOtherPets ;

派生表 OPets 得到所有者所有宠物的计数减去 1,因为我们知道这代表“其他宠物”计数。最大宠物年龄通过聚合分组所有者返回。通过将此数据集重新加入到宠物集中,我们只能得到该主人具有最大年龄的宠物。然后我们加入 petType 来获取该类型宠物的名称(如果多个宠物的最大年龄相同,则为宠物)。

最后,按除 PT.Name 之外的所有字段进行分组,然后选择 min(PetType.Name)。这样,如果存在多种具有相同最古老年龄的动物,我们会按字母顺序选择 TypeName 名称最早的动物。此方法仅在返回数据的情况下有效。如果必须返回宠物名称或宠物 ID,则需要采用不同的方法;但这是迄今为止最简单的方法,给出了所需的结果(返回的列)

count-1 似乎有点黑客,因为 count(*) 返回所有宠物的计数 -1 只是减去我们知道满足 #5 要求的 1:其他 宠物。即使在年龄相关的情况下,这个 # 也是正确的。因为 count-1 永远是“其他宠物”

关于mysql - 从列中选择最大值并从另一列中选择相应的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47228127/

相关文章:

java - SQL 仅替换为一行中的前两列

mysql - DECLARE CONTINUE HANDLER FOR NOT FOUND 不工作

mysql - 如何从具有三个主键的两个表中删除多行?

mysql - 搜索条目 - 在数据库中(不指定列名称/表名称)

sql - Postgres自然顺序

mysql - 在 GROUP BY 中使用 LIMIT 以获得每组 N 个结果?

php - Laravel 5.1 将数据库迁移到托管 mysql

sql - 如何查询存储在表中的消息,以便获得按发件人分组的消息和按时间排序的组?

php - Laravel Eloquent 选择具有 maxcreated_at 的所有行

sql - 如何将 LEFT JOIN 限制为 SQL Server 中的第一个结果?