2012-07-08 79 views
0

我有以下查询具有相同的计数返回所有值

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

'MAX(fed)'是我想你需要的。 – hjpotter92 2012-07-08 09:47:57

+0

什么决定了宠物被喂食的次数?它是一列吗?还是在宠物表中存在多少行?你可以发布你的表格模式吗? – 2012-07-08 09:49:06

+1

发布它,因为你的查询是ambiguos。 – Samson 2012-07-08 09:50:49

回答

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 
) 
+0

这最近的问题基本上是相同的:http://stackoverflow.com/questions/11381674/sql-selecting-all-rows-with-maximum-值/ 11381856#11381856 – shawnt00 2012-07-08 09:56:41

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) 

左外连接将确保你从petLover返回所有结果,即使没有喂食(即如果没有喂食,你将返回所有宠物插图)。如果您只需要饲喂动物的结果,请将其更改回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 
相关问题