从提交表(sql)中获取团队最近提交的内容

niwlg2el  于 2021-06-21  发布在  Mysql
关注(0)|答案(3)|浏览(267)

我有一张table,可以简化为:

ID  |team_id |  submission file  | date     
========================================
1   |  1756  |  final_project.c  |2018-06-22 19:00:00
2   |  1923  |       asdf.c      |2018-06-22 16:00:00
3   |  1756  |     untitled.c    |2018-06-21 20:00:00
4   |  1923  |   my_project.c    |2018-06-21 14:00:00
5   |  1756  |     untitled.c    |2018-06-21 08:00:00
6   |  1814  |   my_project.c    |2018-06-20 12:00:00

这是一张向我提交他们项目的人的表格,但我只想要每个学生最近提交的项目,每个学生都有一个唯一的团队id。
如何回忆每个团队id的最近一行,以便我的回忆如下所示:

ID  |team_id |  submission file  | date   
========================================
1   |  1756  |  final_project.c  |2018-06-22 19:00:00
2   |  1923  |       asdf.c      |2018-06-22 16:00:00
6   |  1814  |   my_project.c    |2018-06-20 12:00:00

谢谢你的帮助!

idv4meu8

idv4meu81#

编辑:在我发疯的时候,yogesh在MySQL5的答案上打败了我。您需要在两个 team_id 以及 submission_file 以防您在同一天收到一个团队提交的多个文件。
根据您使用的mysql版本的不同,可以采用不同的方法来实现。
设置

CREATE TABLE t1 (ID int, team_id int, submission_file varchar(30), the_date date) ;

INSERT INTO t1 (ID,team_id,submission_file,the_date)
SELECT 1, 1756, 'final_project.c', '2018-06-20 19:00:00' UNION ALL  
SELECT 2, 1923, 'asdf.c', '2018-06-22 16:00:00' UNION ALL  /**/
SELECT 3, 1756, 'untitled.c', '2018-06-21 20:00:00' UNION ALL  /**/
SELECT 4, 1923, 'my_project.c', '2018-06-21 14:00:00' UNION ALL  /**/
SELECT 5, 1756, 'untitled.c', '2018-06-21 08:00:00' UNION ALL
SELECT 6, 1814, 'my_project.c', '2018-06-20 12:00:00'  UNION ALL/**/

SELECT 7, 1756, 'final_project.c', '2018-06-21 19:00:00' UNION ALL
SELECT 8, 1756, 'final_project.c', '2018-06-22 00:00:00' /**/

;

查询
如果您使用的是MySQL5.x或更低版本,那么您将希望使用具有 LIMIT 在上面拉上你想要的那排。

/* MySQL <8 */
SELECT a.*
FROM t1 a
WHERE a.id = (
    SELECT b.id
    FROM t1 b
    WHERE b.team_id = a.team_id
      AND b.submission_file = a.submission_file
    ORDER BY b.the_date DESC
    LIMIT 1
) ;
ID | team_id | submission_file | the_date  
-: | ------: | :-------------- | :---------
 2 |    1923 | asdf.c          | 2018-06-22
 3 |    1756 | untitled.c      | 2018-06-21
 4 |    1923 | my_project.c    | 2018-06-21
 6 |    1814 | my_project.c    | 2018-06-20
 8 |    1756 | final_project.c | 2018-06-22

mysql 8添加了窗口函数(最后),这使得这样的问题更容易解决,而且可能也更高效。您可以使用 ROW_NUMBER() 窗口功能。

/* MySQL 8+ */
SELECT s1.ID, s1.team_id, s1.submission_file, s1.the_date
FROM (
  SELECT ID, team_id, submission_file, the_date
    , ROW_NUMBER() OVER (PARTITION BY team_id, submission_file ORDER BY the_date DESC) AS rn
  FROM t1
) s1
WHERE rn = 1
;
ID | team_id | submission_file | the_date  
-: | ------: | :-------------- | :---------
 8 |    1756 | final_project.c | 2018-06-22
 3 |    1756 | untitled.c      | 2018-06-21
 6 |    1814 | my_project.c    | 2018-06-20
 2 |    1923 | asdf.c          | 2018-06-22
 4 |    1923 | my_project.c    | 2018-06-21

db<>在这里摆弄
注:在重读op之后,其意图可能与我最初阅读的有所不同。在我的查询中,我的筛选将返回所有唯一查询中最近的一个 submission_file 团队提交的名称。因此,如果一个团队提交了3个文件,您将获得这些文件的所有3个最新版本。如果你移除 submission_file 从5子查询和8子查询 PARTITION BY ,它将仅返回团队提交的最新单个文件,而不考虑名称。

qxgroojn

qxgroojn2#

Subquery 将使用相关方法执行您想要的操作:

select t.*
from table t -- Need to replace table with your table-name i.e. Projecttble, etc..
where id = (select t1.id
            from table t1 -- Need to replace table with your table-name 
            where t1.team_id = t.team_id 
            order by t1.date desc 
            limit 1
           );
kuuvgm7e

kuuvgm7e3#

您可以使用self-join来选择每个团队最近的一行

select a.*
from your_table a
join (
    select team_id, max(date) date
    from your_table 
    group by team_id
) b on a.team_id = b.team_id and a.date = b.date

相关问题