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