如何从2个事务表中获取最大行数。MySQL
我有两个mysql事务表和两个查找表。我想从每个事务表中选择max(id),将结果与查找表合并,并合并成一行。到目前为止,我似乎找不到解决办法。这是我的桌子。股票和价格是事务性的,而车辆和车型是查找表 车辆表如何从2个事务表中获取最大行数。MySQL,mysql,greatest-n-per-group,Mysql,Greatest N Per Group,我有两个mysql事务表和两个查找表。我想从每个事务表中选择max(id),将结果与查找表合并,并合并成一行。到目前为止,我似乎找不到解决办法。这是我的桌子。股票和价格是事务性的,而车辆和车型是查找表 车辆表 id name 1 Toyota 2 Suzuki id vehicle_id name 1 1 Corolla 2 2 Swift 3 1 Prado 4 2
id name
1 Toyota
2 Suzuki
id vehicle_id name
1 1 Corolla
2 2 Swift
3 1 Prado
4 2 Vitara
id vehicle_id model_id qty
1 1 1 50
2 2 2 77
3 1 1 40
4 2 2 30
id vehicle_id model_id price
1 1 1 500
2 2 2 777
3 1 1 600
4 2 2 1000
型号表
id name
1 Toyota
2 Suzuki
id vehicle_id name
1 1 Corolla
2 2 Swift
3 1 Prado
4 2 Vitara
id vehicle_id model_id qty
1 1 1 50
2 2 2 77
3 1 1 40
4 2 2 30
id vehicle_id model_id price
1 1 1 500
2 2 2 777
3 1 1 600
4 2 2 1000
库存表
id name
1 Toyota
2 Suzuki
id vehicle_id name
1 1 Corolla
2 2 Swift
3 1 Prado
4 2 Vitara
id vehicle_id model_id qty
1 1 1 50
2 2 2 77
3 1 1 40
4 2 2 30
id vehicle_id model_id price
1 1 1 500
2 2 2 777
3 1 1 600
4 2 2 1000
价格表
id name
1 Toyota
2 Suzuki
id vehicle_id name
1 1 Corolla
2 2 Swift
3 1 Prado
4 2 Vitara
id vehicle_id model_id qty
1 1 1 50
2 2 2 77
3 1 1 40
4 2 2 30
id vehicle_id model_id price
1 1 1 500
2 2 2 777
3 1 1 600
4 2 2 1000
预期结果
id vehicle_id model_id qty price vname mname
1 1 1 40 600 Toyota Corolla
2 2 2 30 1000 Suzuki Swift
这是我在无数次尝试中尝试过的
select s.*, b.name vehicle, m.name model, p.price
from stocks s, vehicles b, models m, prices p
where s.id in (select max(id) id from stocks
where s.vehicle_id = b.id and s.model_id = m.id and s.vehicle_id = p.vehicle_id and s.model_id = p.model_id
group by vehicle_id, model_id)
order by id;
运行上面的查询并不能得到我想要的,它会压碎电脑。我必须重新启动。如何实现预期结果?如果您使用的是MySQL 8,您可以使用窗口函数和通用表表达式来获取车辆和车型的最新(基于每辆车和车型组的最大id)价格和数量
with pricescte as (select *,
rank() over (partition by vehicle_id,model_id order by id desc) AS price_rank
from prices),
stockcte as (select *,
rank() over (partition by vehicle_id,model_id order by id desc) AS stock_rank
from stocks)
select v.id,
v.name,
m.id as model_id,
m.name,
s.qty,
p.price
from vehicles v
join models m on v.id = m.vehicle_id
join stockcte s on v.id = s.vehicle_id
and m.id = s.model_id
join pricescte p on v.id = p.vehicle_id
and m.id = p.model_id
where s.stock_rank = 1
and p.price_rank = 1
如果您不在MySQL<8的最新版本上,可以使用如下查询
select v.id,
v.name,
m.id as model_id,
m.name,
s.qty,
p.price
from vehicles v
join models m on v.id = m.vehicle_id
join (
select *
from stocks st
where id = (
select max(id)
from stocks
where st.vehicle_id =vehicle_id
and st.model_id = model_id
)
) s
on v.id = s.vehicle_id
and m.id = s.model_id
join (
select *
from prices pr
where id = (
select max(id)
from prices
where pr.vehicle_id =vehicle_id
and pr.model_id = model_id
)
) p on v.id = p.vehicle_id
and m.id = p.model_id
请更新您的问题标签。Microsoft
sql server
与mysql
冲突,ruby on rails
标记似乎与实际问题无关。@Sander,标记已删除。我是一名Rails用户,所以我添加Ruby on Rails的原因是也许有人可以通过Ruby的方式实现这一点,我使用的是MySQL 5,您的解决方案运行得非常好。谢谢。顺便问一下,哪个文献/书籍涵盖了这一点?@JohnMilo its all from SO university:),除此之外,您还可以访问mysql问题的每个组的最大n标记,对于组最大值,可以使用多种方法