SQL连接到mySQL中的最新记录

jvlzgdj9  于 2023-04-19  发布在  Mysql
关注(0)|答案(3)|浏览(122)

这不能解决我的问题SQL Join to the latest record
我想以这样一种方式连接表,它只从使用MySQL的表中获取最新的记录,并计算具有特定值的read_reciep列
以下是我的数据。
表一:
| ID|姓名|
| --------------|--------------|
| 1|约翰|
| 二|汤姆|
| 三|安娜|
表二:
| ID|访视ID|日期|读接收|
| --------------|--------------|--------------|--------------|
| 1|二五一三|二零零一年五月五日|1|
| 1|八四六五四|2012年10月5日|1|
| 1|四五四|2018年4月20日|1|
| 二|七五四|一九九九年五月四日|0|
| 二|六五四|2010年8月8日|1|
| 二|六二四|1982年9月4日|1|
| 三|七五四六|一九九七年三月七日|0|
| 三|二四六五七四|2015年6月4日|1|
| 三|15487|2017年3月4日|1|
加入后需要的结果:
| ID|姓名|访视ID|日期|读接收|
| --------------|--------------|--------------|--------------|--------------|
| 1|约翰|四五四|2018年4月20日|三|
| 二|汤姆|六五四|2010年8月8日|二|
| 三|安娜|二四六五七四|2015年6月4日|二|

ldfqzlk8

ldfqzlk81#

假设您的版本是8.0,您有两个选择:

  1. LATERAL JOIN。只是一个文档链接,因为它的效率较低,(对于MySQL)更难写。
    1.开窗功能:
SELECT ID, Name,VisitID, Date
FROM (
    SELECT t1.ID, t1.Name, t2.VisitID, t2.Date,
        row_number() over (PARTITION BY t1.ID ORDER BY t2.Date DESC) rn
    FROM Table_One t1
    INNER JOIN Table_Two t2 ON t2.ID = t1.ID
) t 
WHERE rn = 1

如果你使用的是旧版本,首先要表示哀悼。5.7和更旧的版本甚至不能算是一个现代数据库,而且已经很长时间没有了。但是this is still possible

2wnc66cl

2wnc66cl2#

如果你使用的是旧版本的mysql,那么试试这个:
步骤:
首先,我们需要获取最新的日期:

select ID, MAX(Date) as max_date, sum(read_reciept) as read_reciept
from Table_two
group by ID

然后我们得到相关的Visit_ID和sum(read_reciep):

SELECT a.ID, a.Visit_ID, t.max_date, t.read_reciept
FROM Table_two a
INNER JOIN (
  select ID, MAX(Date) as max_date, sum(read_reciept) as read_reciept
  from Table_two
  group by ID
) as t on a.ID = t.ID and a.Date = t.max_date

最后我们使用INNER JOIN连接我们的数据以得到预期的结果

SELECT a.ID, b.Name, a.Visit_ID, a.Date, t.read_reciept
FROM Table_two a
INNER JOIN Table_One b on a.ID = b.ID
INNER JOIN (
   select ID, MAX(Date) as max_date, sum(read_reciept) as read_reciept
   from Table_two
 group by ID
) as t on a.ID = t.ID and a.Date = t.max_date

Demo here

nimxete2

nimxete23#

row_number使用子查询,只从该table_two中获取最后一行。

select Table_One.ID, name, Visit_ID, date_
from Table_One
join (select ID, Visit_ID, date_, row_number() over (partition by id order by date_ desc) rn
      from Table_two) t2
on (t2.ID = Table_One.ID and t2.rn=1)

这里row_number将根据date列的顺序对具有相同ID的行进行编号。
稍后在join期间,我们只取值等于1的行,在本例中这意味着-最旧的。

相关问题