Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从2个事务表中获取最大行数。MySQL_Mysql_Greatest N Per Group - Fatal编程技术网

如何从2个事务表中获取最大行数。MySQL

如何从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

我有两个mysql事务表和两个查找表。我想从每个事务表中选择max(id),将结果与查找表合并,并合并成一行。到目前为止,我似乎找不到解决办法。这是我的桌子。股票和价格是事务性的,而车辆和车型是查找表

车辆表

 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标记,对于组最大值,可以使用多种方法