繁体   English   中英

MYSQL - 两个表从每个用户的第二个表最后跟踪的行中获取记录

[英]MYSQL - Two tables get record from second table last tracked row for each user

我有两张桌子

表 A 有usr_id , usr_name , usr_status [1 or 0]

B表有id, usr_id,tracked_date [Each user can track multiple time]

需要获取每个用户的最后一个track usr_status = 1

如何通过MySQL实现查询?

尝试过:

SELECT 
    *
FROM
    tableb b
        LEFT JOIN
    tablea a ON a.usr_id = b.usr_id
GROUP BY a.usr_id

请指教 ?

  • 在派生表,得到的最大值tracked_date为每usr_id
  • 将此结果集连接回主表,以获取相应的行。

尝试:

SELECT 
  ta.*, tb.* 
FROM 
  tablea AS ta 
JOIN tableb AS tb 
  ON tb.user_id = ta.usr_id 
JOIN (
      SELECT 
        user_id, 
        MAX(tracked_date) AS max_tracked_date 
      FROM tableb
      GROUP BY user_id
     ) AS dt 
  ON dt.usr_id = tb.usr_id AND 
     dt.max_tracked_date = tb.tracked_date 
WHERE ta.usr_status = 1

在 MySQL 版本(8.0.2 及以上)中,我们可以使用Window Functions 使用Row_Number()我们可以将tracked_date分区中usr_id值最高的行的行号设置为 1。 现在,我们可以将其用作派生表并仅考虑行号等于 1 的行。

SELECT 
  dt.* 
FROM 
(
  SELECT
    ta.*, 
    tb.*, 
    ROW_NUMBER() OVER (PARTITION BY ta.usr_id 
                       ORDER BY tb.tracked_date DESC) AS row_no 
  FROM 
    tablea AS ta 
  JOIN tableb AS tb ON tb.usr_id = ta.usr_id 
  WHERE ta.usr_status = 1
) AS dt 
WHERE dt.row_no = 1

附加:如果您希望获得所有用户( status = 1 ),但还没有tracked_date条目; 直接的LEFT JOIN在表和派生表之间不起作用。

我们必须首先在单独的派生表中获取与最大tracked_date对应的完整行; 然后从 users 表中执行LEFT JOIN以获取所有用户。

SELECT
ta.*, dt2.* 
FROM
  tablea AS ta
LEFT JOIN 
(SELECT tb.*, 
        dt.max_tracked_date
 FROM tableb AS tb
 JOIN (
       SELECT
         usr_id,
         MAX(tracked_date) AS max_tracked_date
       FROM tableb
       GROUP BY usr_id
      ) AS dt
   ON (dt.usr_id = tb.usr_id AND
       dt.max_tracked_date = tb.tracked_date) 
) AS dt2 ON ta.usr_id = dt2.usr_id  
WHERE ta.usr_status = 1

结果

| usr_id | usr_name | usr_status | id  | usr_id | stage | tracked_date        | max_tracked_date    |
| ------ | -------- | ---------- | --- | ------ | ----- | ------------------- | ------------------- |
| 1      | john     | 1          | 2   | 1      | 2     | 2018-11-12 13:12:12 | 2018-11-12 13:12:12 |
| 2      | dave     | 1          | 3   | 2      | 1     | 2018-11-12 13:12:12 | 2018-11-12 13:12:12 |
| 3      | smith    | 1          |     |        |       |                     |                     |

在 DB Fiddle 上查看

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM