0

我有两张桌子raw_materialsraw_materials_moves

raw_materials有字段

id, name

raw_materials_moves有这个字段

id, raw_material_id, price, created

所以,我需要对select每种原材料进行 3 次移动

我有这个查询,但不工作

SELECT a.*, b.price, b.created
FROM raw_materials a
LEFT JOIN
 (SELECT price, raw_material_id, created FROM raw_material_moves ORDER BY created DESC LIMIT 3) b
    ON b.raw_material_id=a.id
ORDER BY a.id
4

5 回答 5

1

我主要同意@chetan 关于使用变量来完成这项工作的观点。

这是我在这个主题上遇到的最好的文章之一,以及处理它的不同方法……从简单到困难。

于 2013-07-03T05:30:05.157 回答
0

每种原材料的创建(我假设日期)的最后 3 个动作

select * from 
  (select a.id,a.price,a.created, 
          if(@mat=a.raw_material_id,@num:=@num+1,@num:=1) rank,
          @mat:=a.raw_material_id
     from raw_materials_moves a, (select @num:=0) b   
     order by a.raw_material_id,a.created desc) temp
where rank <=3;

在此处查看演示

于 2013-07-03T05:10:46.913 回答
0

我会建议您通过以相反的顺序获取来使用 DESC(或)用户光标

于 2013-07-03T04:53:02.810 回答
0
  SELECT r1.id,name,raw_material_id 

FROM raw_materials r1, raw_materials_move r2

 WHERE r1.id=r2.id ORDER BY DESC LIMIT 3;
于 2013-07-03T05:06:10.627 回答
-3

对其进行反向排序(即... SORT BY somefield DESC),然后获取前 3 个(通过附加LIMIT 3

于 2013-07-03T04:47:47.763 回答