我知道有关同一主题的问题,但我无法正确解决。
我正在关注此link,并尝试了以下查询:
SELECT * FROM food_list f
INNER JOIN (
SELECT MAX(updated_on) max_row, rate, item_id
FROM food_rate
GROUP BY rate, item_id
) f_max ON (f_max.item_id = f.id)
INNER JOIN food_rate fr ON (fr.updated_on = f_max.max_row);
但是我没有正确记录。
这是我的桌子:
food_list:
id | item
----------------
1 | pizza
2 | burger
3 | sandwich
food_rate:
id | item_id | rate | updated_on
----------------------------------------------
1 | 1 | 80 | 2018-06-01
2 | 2 | 90 | 2018-06-01
3 | 3 | 70 | 2018-06-01
4 | 1 | 60 | 2018-06-02
我想从food_rate接收food_list中每个项目的最新日期的记录。
这是预期的输出:
item_id | rate | updated_on
----------------------------------
1 | 60 | 2018-06-02
2 | 90 | 2018-06-01
3 | 70 | 2018-06-01
答案 0 :(得分:1)
您可以使用相关子查询获取最新行:
select fr.*
from food_rate fr
where fr.updated_on = (select max(fr2.updated_on)
from food_rate fr2
where fr2.item_id = fr.item_id
);
您可以添加join
进行过滤:
select fr.*
from food_list fl join
food_rate fr
on fr.item_id = fl.id
where fr.updated_on = (select max(fr2.updated_on)
from food_rate fr2
where fr2.item_id = fr.item_id
);
您可以使用聚合方法,但效率较低(给定适当的索引),因为join
上的food_list
可能会减少行数。 on
子句中缺少条件:
INNER JOIN
food_rate fr
ON fr.updated_on = f_max.max_row AND fr.item_id = f_max.item_id;
答案 1 :(得分:1)
您只想从food_rate
表中获取数据,因此无需连接任何内容。从food_rate
中选择,其中updated_on
是updated_on
的最大值item_id
:
select item_id, rate, updated_on
from food_rate
where (item_id, updated_on) in
(
select item_id, max(updated_on)
from food_rate
group by item_id
);
从MySQL 8.0开始,您还可以为此使用窗口函数,因此只能读取一次表:
select item_id, rate, updated_on
from
(
select
item_id, rate, updated_on,
max(updated_on) over (partition by item_id) as max_updated_on
from food_rate
) rates
where updated_on = max_updated_on;