我有以下查询
select id, nameOfPet, count(fed)
from petLover, pets
where id = 180 and petLover.nameOfPet = pets.nameOfPet
group by fed
order by fed desc;
所以查询的作用是获取一个人的身份,获取他拥有的宠物的所有名字,在同一个人的桌子上查看宠物并检查哪些宠物被喂了多少次并输出该人的身份证,宠物的名字以及喂食的频率。
现在我想只输出最多吃的宠物。我当然可以使用limit 1
,但如果几只宠物的喂食次数相同,我想输出全部。
答案 0 :(得分:2)
嵌套查询派生了计数。除了只有一个列,它与最外面的查询相同。
select id, nameOfPet, count(fed)
from petLover, pets
where id = 180 and petLover.nameOfPet = pets.nameOfPet
group by fed
having count(fed) >= ALL (
select count(fed)
from petLover, pets
where id = 180 and petLover.nameOfPet = pets.nameOfPet
group by fed
)
答案 1 :(得分:0)
您发布的查询将无法运行;你需要按id,nameOfPet进行分组。这是个人偏好,但我也会指定您的联接(以使其更易读,更容易在联接类型之间进行更改):
SELECT id, nameOfPet, COUNT(p.fed)
FROM petLover pl
LEFT OUTER JOIN pets p ON pl.nameOfPet = p.nameOfPet
WHERE id = 180
GROUP BY id, nameOfPet
ORDER BY COUNT(p.fed)
LEFT OUTER JOIN将确保您返回petLover的所有结果,即使没有被喂食(即如果没有喂食,您将返回所有petLovers)。如果您只想在喂食动物时想要结果,请将其更改回INNER JOIN。这是一个修改过的查询来执行您要查找的内容(基于行):
SELECT pl.id, pl.nameOfPet, COUNT(*)
FROM petLover pl
LEFT OUTER JOIN pets p ON pl.nameOfPet = p.nameOfPet
GROUP BY pl.id, pl.nameOfPet
HAVING COUNT(*) >= ALL (
SELECT COUNT(*)
FROM petLover pl
LEFT OUTER JOIN pets p ON pl.nameOfPet = p.nameOfPet
GROUP BY pl.id, pl.nameOfPet
)
ORDER BY COUNT(*) DESC
修改强>
除了原始评论中我的问题的答案之外,您应该能够执行以下操作来修改上面的SQL:
SELECT pl.id, pl.nameOfPet, SUM(p.fed)
FROM petLover pl
LEFT OUTER JOIN pets p ON pl.nameOfPet = p.nameOfPet
GROUP BY pl.id, pl.nameOfPet
HAVING SUM(p.fed) >= ALL (
SELECT SUM(p.fed)
FROM petLover pl
LEFT OUTER JOIN pets p ON pl.nameOfPet = p.nameOfPet
GROUP BY pl.id, pl.nameOfPet
)
ORDER BY SUM(p.fed) DESC