仅包含最近行的join表

o8x7eapl  于 2021-06-24  发布在  Mysql
关注(0)|答案(2)|浏览(318)

我知道在同一个主题上有很多问题,但我没有弄对。
我正在跟踪此链接,并尝试此查询:

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);

但我的记录不对。
这是我的table:

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

我想收到食品价格表中每一项最新日期的记录。
以下是预期输出:

item_id   |  rate   |   updated_on
----------------------------------
1         |   60    |   2018-06-02
2         |   90    |   2018-06-01
3         |   70    |   2018-06-01
t98cgbkg

t98cgbkg1#

你只想从 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;
im9ewurl

im9ewurl2#

可以使用相关子查询获取最新的行:

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
                      );

您可以使用聚合方法,但它可能效率较低(给定适当的索引),因为 joinfood_list 可能会减少行数。您在中缺少一个条件 on 条款:

INNER JOIN
food_rate fr
ON fr.updated_on = f_max.max_row AND fr.item_id = f_max.item_id;

相关问题