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

Php MYSQL-两个表为每个用户从第二个表最后跟踪的行中获取记录,php,mysql,Php,Mysql,我有两张桌子 表A有usr\u id、usr\u名称、usr\u状态[1或0] 表B有id、usr\u id、跟踪日期[每个用户可以跟踪多个时间] 需要获取每个用户的最后一条信息,其状态为usr\u status=1 如何通过MySQL查询实现 试着像: SELECT * FROM tableb b LEFT JOIN tablea a ON a.usr_id = b.usr_id GROUP BY a.usr_id 请给出建议? 在派生表中,为每个u

我有两张桌子

表A有
usr\u id、usr\u名称、usr\u状态[1或0]

表B有
id、usr\u id、跟踪日期[每个用户可以跟踪多个时间]

需要获取每个用户的最后一条信息,其状态为
usr\u status=1

如何通过MySQL查询实现

试着像:

SELECT 
    *
FROM
    tableb b
        LEFT JOIN
    tablea a ON a.usr_id = b.usr_id
GROUP BY a.usr_id
请给出建议?

  • 在派生表中,为每个
    usr\u id
  • 将此结果集连接回主表,以获得相应的行
尝试:


在MySQL版本(8.0.2及以上)中,我们可以使用。使用
Row\u Number()
我们可以在
usr\u id
分区中将
tracked\u date
值最高的行的行号设置为1。现在,我们可以使用它作为派生表,只考虑行数等于1的那些行。< /P>
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\u date
条目;直接的
左联接在表和派生表之间不起作用

我们必须首先在一个单独的派生表中获得对应于最大
跟踪日期
完整行;然后从用户表中执行
左联接
,以获取所有用户

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

@vignesh.D很乐意提供帮助:)顺便说一句,如果您可以使用MySQL 8.0.2及更高版本,那么使用窗口函数进行的详细查询就更少了。好的。。谢谢:)工作正常,但它不会显示没有曲目的用户,也需要显示没有曲目的用户list@vignesh.D将所有
internal JOIN
更改为
LEFT JOIN
以获取用户(即使没有曲目列表)。已尝试,但结果仍然相同@madhur
| 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          |     |        |       |                     |                     |