mysql的组查询的名称和顺序通过ID和限制通过ID

问题描述:

我有这样mysql的组查询的名称和顺序通过ID和限制通过ID

id name amount 
1 fish 120 
1 meat 230 
2 meat 110 
2 fish 78 
1 salad 50 
3 meat 103 
3 salad 22 
2 salad 34 

一个表,我想编写一个查询,将集团的名称和总结他们的数量,但应该限制到第一个两个ID,从而按名称和总和每个匹配的名称组合的项目...这应该限制它的前两个ID。那只是id 1和2。留下id 3.注意。该ID是来自另一个表的外键。

这是我试过的。但它不工作

select name, sum(amount) from table1 group by amount, id order by id limit 2 

这只是输出做了计算这样

name amount 
fish 198 
meat 340 
salad 84 

name amount 
fish 198 
meat 443 

我期待的东西2分后的结果添加项目的金额仅为1 ID和两个按名称分组

+0

因为你使用'限制2'和group by应该是'按名称顺序按id' – JYoThI

+0

限制记录@约翰请我的答案 –

+0

@约翰。仔细检查edisoni.1337的答案。对我来说这是不正确的。尝试删除id = 1的'沙拉',或用'5 fish'替换'2 fish' – StanislavL

你不想限制到总产量,但你想限制它之前,它可以做到这一点,你可以使用子查询。

select t1.name, sum(t1.amount) 
from table1 t1 join 
    (select tt1.id 
     from table1 tt1 
     group by id 
     order by id 
     limit 2 
    ) t2 
    on t1.id = t2.id 
group by t1.name; 

工作实例link

结果:

name sum(t1.amount) 

fish 198 

meat 340 

salad 84 
+2

这与我发布的查询完全相同,直至命名约定和格式。关于查询明智格式的荣誉。 (我应该注意,我并没有downvote。) –

+0

@GordonLinoff你的例子不工作,所以再次检查你的代码:)你正在加入一个不存在的表 –

+0

我会说答案是不正确的。如果你删除id = 1的'沙拉',它返回沙拉34,但预期是56(这是由我的答案返回)。但答案已被接受。谁知道什么是正确的。 (虽然我不是downvoter) – StanislavL

SELECT name, sum(amount) 
    FROM table1 
WHERE id <= 2 
GROUP BY name 
ORDER BY name 
+2

如果删除了两个第一个id并且他运行了这个查询,该怎么办? –

+0

Downvote为什么呢? – RealCheeseLord

+0

我没有投下它,但我说你完全错了 –

前两个ID是什么?如果我假设你的意思是 “全球”,则:

select t1.name, sum(t1.amount) 
from table1 t1 join 
    (select tt1.id 
     from table1 tt1 
     group by id 
     order by id 
     limit 2 
    ) tt1 
    on t1.id = tt1.id 
group by t1.name; 
+0

我不downvoter,但它看起来每个组中的前2个ID(每个名称只是第2个ID) – StanislavL

+0

@StanislavL。 。 。它看起来像我的整体头两个ID。 –

+0

我发布了基于MySQL会话变量的答案。猜测结果可以通过两次连接相同的表并在ON部分包括't1.id StanislavL

取出LIMIT只有GROUP BYname

SELECT Name, SUM(amount) AS Amount 
FROM table1 
GROUP BY name 
ORDER BY id 

输出

Name Amount 
fish 198 
meat 443 
salad 106 

SQL小提琴:http://sqlfiddle.com/#!9/2a8868/7/0

+0

这不是必需的。对于沙拉,仅需要总计2行(前2个ids)50 + 34而不是所有组 – StanislavL

我认为你可以使用这样的事情:

SELECT B.NAME, SUM(B.AMOUNT) AS AMOUNT 
FROM (
     SELECT a.* , 
     @r:= CASE WHEN @g = a.NAME THEN @r+1 ELSE 1 END consecutive, 
     @g:= a.NAME g  
     FROM DISHES a 
     CROSS JOIN (SELECT @g:='', @r:=1) t1 
     ORDER BY A.NAME, A.id 
    ) B 
     WHERE B.consecutive<=2 
     GROUP BY B.NAME; 

输出:

NAME AMOUNT 
fish 198 
meat 340 
salad 84 
+0

它已被更新...(我真的不喜欢谁提供太多的负面投票和也隐藏自己。) – etsa

select name, sum(amount) 
from 
    (SELECT id, name, amount, 
     CASE WHEN @name=name THEN @rown:[email protected]+1 ELSE @rown:=0 END as rn, 
     @name:=name 
    FROM table1, (select @rown:=0, @name:='') s 
    ORDER BY name, id 
) sub 
where rn<=1 
group by name 

输出

fish 198 
meat 340 
salad 84