2015-07-12 48 views
0

我有2个表:获取最后的成本为每行

materials: 
     int id 
    text title 

    costs: 
    int id 
    int material_id 
    int cost 
datetime created_at 

数据:

materials: 
1 Wood 
2 Steel 
3 ... 

costs: 
1,1,200,2015-07-02 
2,1,205,2015-07-03 
3,1,210,2015-07-04 

我想去年的成本资料。 这样的:

id title cost 
1 Wood 210 

我试试这个:

select materials.id, title, cost from materials 
left join (
    select * from costs 
    order by costs.id DESC 
) as costs on costs.material_id = materials.id 
group by materials.id 

这:

select materials.id, materials.title, c1.cost from costs c1 
    join (select material_id, max(id) as id from costs group by material_id) AS c2 
     on c1.id = c2.id 
left join materials on materials.id = c1.material_id 

但成本有时是不正确的(!)。

一个值这个返回正确的成本:

select cost, material_id 
    from costs 
    where material_id = 2 
     order by id DESC 
     limit 1 

现在我刚刚得到的材料清单,并获得在PHP foreach循环费用(+1查询的每一行)

请帮助我!

+0

我不认为这是从描述和缺乏数据集提供确切负责。 – Strawberry

回答

0
select m.id, m.title, c1.cost 
from materials m 
join costs c1 on c1.material_id = m.id 
join 
(
    select material_id, max(created_at) as dt 
    from costs 
    group by material_id 
) c2 on c2.material_id = m.id and c2.dt = c1.created_at 
+0

感谢您的快速回答!您的查询按成本返回重复项。增加“通过m.id的gropup”将返回第一个成本。即1,木头,200。 –