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和两个按名称分组
你不想限制到总产量,但你想限制它之前,它可以做到这一点,你可以使用子查询。
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
这与我发布的查询完全相同,直至命名约定和格式。关于查询明智格式的荣誉。 (我应该注意,我并没有downvote。) –
@GordonLinoff你的例子不工作,所以再次检查你的代码:)你正在加入一个不存在的表 –
我会说答案是不正确的。如果你删除id = 1的'沙拉',它返回沙拉34,但预期是56(这是由我的答案返回)。但答案已被接受。谁知道什么是正确的。 (虽然我不是downvoter) – StanislavL
SELECT name, sum(amount)
FROM table1
WHERE id <= 2
GROUP BY name
ORDER BY name
前两个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;
我不downvoter,但它看起来每个组中的前2个ID(每个名称只是第2个ID) – StanislavL
@StanislavL。 。 。它看起来像我的整体头两个ID。 –
我发布了基于MySQL会话变量的答案。猜测结果可以通过两次连接相同的表并在ON部分包括't1.id
取出LIMIT
只有GROUP BY
的name
SELECT Name, SUM(amount) AS Amount
FROM table1
GROUP BY name
ORDER BY id
输出
Name Amount
fish 198
meat 443
salad 106
这不是必需的。对于沙拉,仅需要总计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
它已被更新...(我真的不喜欢谁提供太多的负面投票和也隐藏自己。) – 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
因为你使用'限制2'和group by应该是'按名称顺序按id' – JYoThI
限制记录@约翰请我的答案 –
@约翰。仔细检查edisoni.1337的答案。对我来说这是不正确的。尝试删除id = 1的'沙拉',或用'5 fish'替换'2 fish' – StanislavL