[英]select max from multiple columns mysql with corresponding column value
[英]Select MAX value from column and corresponding value from another
这可能是一个相对简单的问题,但我正在努力解决。 我下面列出了三个表( owners, pets, petTypes
),并试图在一个查询中提取以下数据。 前两个并不难,但是第三和第四是我努力的地方。
如果要复制表数据: https : //pastebin.com/veXHwcMc
问题:
拥有者编号
所有者名称
我尝试过的
选择年龄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;
表以同时显示SELECT pets.ownerId, MAX(pets.age), petTypes.name FROM pets INNER JOIN petTypes ON pets.petTypeId = petTypes.id GROUP BY pets.ownerId;
但这是错误的。 因为它们都在显示猫的时候应该为最老的猫显示正确的名称。
我想到了这个问题: 如何在SQL中用另一列选择MAX(列值),DISTINCT来选择行?
所以我尝试了: 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 column 'petTypes.id' in 'on clause'
任何帮助请
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将永远是“其他宠物”
这应该可以,不能测试,但是如果主人有两个或更多相同年龄的宠物,它将显示多个记录。
Select ow.Firstname, ow.lastname ,petinfo.Age, petinfo.Name, petcount.TotalPets
from #owners ow
join ( Select age, p.petTypeId, p.OwnerID, pt.name From
(select max(age) as age, petTypeId, OwnerID
from #pets p
Group by OwnerID,petTypeId
) p
Join #petTypes pt on pt.ID = p.petTypeId
) petinfo
on petinfo.OwnerID = ow.id
Join (
Select Count(*) TotalPets, ownerID
From #Pets
group by OwnerID
) petcount
on petcount.ownerID = ow.ID
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.