仅将表与最近的行联接

时间:2018-06-28 11:35:50

标签: mysql sql aggregate-functions

我知道有关同一主题的问题,但我无法正确解决。

我正在关注此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

2 个答案:

答案 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_onupdated_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;