Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 从上一条记录中选择并使用两个主要订购者 用户: 追踪: 应用: 请注意,该表可以包含同一用户的多条记录,只要其以前的所有应用程序都已结束(状态=已结束) 用户id不是唯一的(仅适用于应用程序表) 日期为年月日格式 结束日期和等级仅在应用程序结束时更新 此外,我了解可能建议“状态”有自己的表格,但我更希望以上表格按原样处理(当然要减去打字错误和重大错误)_Mysql_Sql_Greatest N Per Group - Fatal编程技术网

Mysql 从上一条记录中选择并使用两个主要订购者 用户: 追踪: 应用: 请注意,该表可以包含同一用户的多条记录,只要其以前的所有应用程序都已结束(状态=已结束) 用户id不是唯一的(仅适用于应用程序表) 日期为年月日格式 结束日期和等级仅在应用程序结束时更新 此外,我了解可能建议“状态”有自己的表格,但我更希望以上表格按原样处理(当然要减去打字错误和重大错误)

Mysql 从上一条记录中选择并使用两个主要订购者 用户: 追踪: 应用: 请注意,该表可以包含同一用户的多条记录,只要其以前的所有应用程序都已结束(状态=已结束) 用户id不是唯一的(仅适用于应用程序表) 日期为年月日格式 结束日期和等级仅在应用程序结束时更新 此外,我了解可能建议“状态”有自己的表格,但我更希望以上表格按原样处理(当然要减去打字错误和重大错误),mysql,sql,greatest-n-per-group,Mysql,Sql,Greatest N Per Group,我想在这里完成的是检索状态为“待定”的所有行,并且每个检索行的grade列的值都是最新grade的值(换句话说,具有最新结束日期的行)(在上面的括号中)其中,此特定用户(或行)的状态为“已结束” 另外,我需要将结果的前10行按等级ASC排序。并在应用程序ASC的日期前订购之后的后续行(第11行到最后一行) 显然,SQL查询并不是我最擅长的领域,所以我不确定使用2个或更多查询来执行这些ORDER BY是否更好(或者只可能更好)。然而,我更喜欢只使用一个查询来实现这一点 预期结果: 到目前为止,我的

我想在这里完成的是检索状态为“待定”的所有行并且每个检索行的grade列的值都是最新grade的值(换句话说,具有最新结束日期的行)(在上面的括号中)其中,此特定用户(或行)的状态为“已结束”

另外,我需要将结果的前10行等级ASC排序。并在应用程序ASC的日期前订购之后的后续行(第11行到最后一行)

显然,SQL查询并不是我最擅长的领域,所以我不确定使用2个或更多查询来执行这些ORDER BY是否更好(或者只可能更好)。然而,我更喜欢只使用一个查询来实现这一点

预期结果: 到目前为止,我的工作代码[减去可能的打字错误],(列出的是要应用的附加代码):

  • 最新等级
  • 按等级(前10)订购,按申请日期(第11行至最后一行)订购
查询:

SELECT users.user_name,
       t.track,
       a.user_id,
       a.date_of_application,
       a.status,
       (SELECT ae.grade
          FROM applications AS ae
          WHERE ae.status = 'Ended' 
            AND ae.user_id = a.user_id                                                            
         LIMIT 1) AS grade
  FROM users
  JOIN applications AS a ON users.user_id = a.user_id
  JOIN tracking AS t ON users.user_id = t.user_id
 WHERE a.status = 'Pending'
ORDER BY grade ASC

在这里,您可能试图在一个查询中执行太多操作

无论如何,如果你想弄伤眼睛:

 select a.* from
 (
 SELECT u.user_name,
 a.user_id,
 a.date_of_application,
 td.grade,
 a.status,
 t.track
 FROM users u
 JOIN applications AS a ON u.user_id = a.user_id
 JOIN tracking AS t ON u.user_id = t.user_id
 LEFT OUTER JOIN
 (
 select ap.user_id,ap.grade 
 from applications ap
 inner join
 (select a.user_id,max(date_ended) as max_ended_date
 from applications a
 where a.status = 'Ended'
 group by a.user_id
 ) md on md.user_id = ap.user_id and ap.date_ended = md.max_ended_date
 ) as td on u.user_id = td.user_id
 WHERE a.status = 'Pending'
 ORDER BY cast(replace(replace(td.grade,'(',''),')','') as decimal(12,2)),u.user_id ASC
 LIMIT 10
 ) a
 WHERE grade is not null
 UNION ALL
 select b.* from
 (
 SELECT u.user_name,
   u.user_id,
   a2.date_of_application,
   td.grade,
   ifnull(a2.status,'No applications yet') as status,
   t2.track
 FROM users u
 LEFT OUTER JOIN (select user_id,date_of_application,status from applications where     status = 'Pending') AS a2 ON u.user_id = a2.user_id
 JOIN tracking AS t2 ON u.user_id = t2.user_id
 LEFT OUTER JOIN
 ( 
 select ap.user_id,ap.grade 
 from applications ap
 inner join
  (select a.user_id,max(date_ended) as max_ended_date
  from applications a
  where a.status = 'Ended'
  group by a.user_id
 ) md on md.user_id = ap.user_id and ap.date_ended = md.max_ended_date
 ) as td on u.user_id = td.user_id
 where u.user_id not in (
 select t1.user_id
 from (
 select ap1.user_id,ap1.grade 
  from applications ap1
  inner join
  (select a1.user_id,max(date_ended) as max_ended_date
   from applications a1
   where a1.status = 'Ended'
   group by a1.user_id
  ) md1 on md1.user_id = ap1.user_id and ap1.date_ended = md1.max_ended_date
  order by cast(replace(replace(ap1.grade,'(',''),')','') as decimal(12,2)),md1.user_id asc
  limit 10
  ) as t1
 )
 ORDER BY status desc,a2.date_of_application ASC
 ) b;
这确实做出了以下假设:

  • users
    中的每个用户id始终只有一行,并且
    跟踪
    表格
  • 编辑

    要稍微解释一下这个查询:

    内联视图别名为
    a
    (也称为“上半部分”),根据最近的“结束”等级,返回前10名用户的列表。请注意,查询的以下部分将从成绩中删除任何括号,将结果数字转换为小数点后2位,并按成绩升序,如果成绩相等,则按用户id升序:

    ORDER BY cast(replace(replace(td.grade,'(',''),')','') as decimal(12,2)),u.user_id ASC
    

    内联视图
    b
    与内联视图
    a
    几乎相同,只是排除了将出现在上半部分的用户,并按状态对结果排序
    DESC
    (将没有应用程序的用户移到列表底部)申请日期
    ASC

    您可能试图在这里的一个查询中做太多的事情

    无论如何,如果你想弄伤眼睛:

     select a.* from
     (
     SELECT u.user_name,
     a.user_id,
     a.date_of_application,
     td.grade,
     a.status,
     t.track
     FROM users u
     JOIN applications AS a ON u.user_id = a.user_id
     JOIN tracking AS t ON u.user_id = t.user_id
     LEFT OUTER JOIN
     (
     select ap.user_id,ap.grade 
     from applications ap
     inner join
     (select a.user_id,max(date_ended) as max_ended_date
     from applications a
     where a.status = 'Ended'
     group by a.user_id
     ) md on md.user_id = ap.user_id and ap.date_ended = md.max_ended_date
     ) as td on u.user_id = td.user_id
     WHERE a.status = 'Pending'
     ORDER BY cast(replace(replace(td.grade,'(',''),')','') as decimal(12,2)),u.user_id ASC
     LIMIT 10
     ) a
     WHERE grade is not null
     UNION ALL
     select b.* from
     (
     SELECT u.user_name,
       u.user_id,
       a2.date_of_application,
       td.grade,
       ifnull(a2.status,'No applications yet') as status,
       t2.track
     FROM users u
     LEFT OUTER JOIN (select user_id,date_of_application,status from applications where     status = 'Pending') AS a2 ON u.user_id = a2.user_id
     JOIN tracking AS t2 ON u.user_id = t2.user_id
     LEFT OUTER JOIN
     ( 
     select ap.user_id,ap.grade 
     from applications ap
     inner join
      (select a.user_id,max(date_ended) as max_ended_date
      from applications a
      where a.status = 'Ended'
      group by a.user_id
     ) md on md.user_id = ap.user_id and ap.date_ended = md.max_ended_date
     ) as td on u.user_id = td.user_id
     where u.user_id not in (
     select t1.user_id
     from (
     select ap1.user_id,ap1.grade 
      from applications ap1
      inner join
      (select a1.user_id,max(date_ended) as max_ended_date
       from applications a1
       where a1.status = 'Ended'
       group by a1.user_id
      ) md1 on md1.user_id = ap1.user_id and ap1.date_ended = md1.max_ended_date
      order by cast(replace(replace(ap1.grade,'(',''),')','') as decimal(12,2)),md1.user_id asc
      limit 10
      ) as t1
     )
     ORDER BY status desc,a2.date_of_application ASC
     ) b;
    
    这确实做出了以下假设:

  • users
    中的每个用户id始终只有一行,并且
    跟踪
    表格
  • 编辑

    要稍微解释一下这个查询:

    内联视图别名为
    a
    (也称为“上半部分”),根据最近的“结束”等级,返回前10名用户的列表。请注意,查询的以下部分将从成绩中删除任何括号,将结果数字转换为小数点后2位,并按成绩升序,如果成绩相等,则按用户id升序:

    ORDER BY cast(replace(replace(td.grade,'(',''),')','') as decimal(12,2)),u.user_id ASC
    

    内联视图
    b
    与内联视图
    a
    几乎相同,不同之处在于它排除了将出现在上半部分的用户,并按状态
    DESC
    (将没有应用程序的用户移到列表底部)和应用日期
    ASC
    对您来说应该很好。。。要澄清发生了什么,您必须从查询的最内部开始。对于每个用户,找到最高的“挂起”日期(因为正如您所说的,只有一个),以及最后一个“结束”的上课日期。按用户分组。这将保证每个用户有一条记录,作为预查询预先计算两条记录

    接下来,对应用程序表进行两次自联接。。。一次按用户和最后一个结束日期,下一次按用户和最后一个挂起日期。通过左连接,如果你只有一个人有一个应用程序,没有结束,他们将被包括在内。。。同样,如果只有一个已完成的类没有更多挂起的应用程序,它们也将被包括在内

    从这些别名参照中提取相应的列以获得等级。当我们这样做的时候,通过使用SQL变量,并使用此查询的按等级降序,将从1-n中放入最佳等级,而不考虑应用日期

    最后,获取整个结果集,并通过。。。按以下条件排序:如果用户的排名小于11,则使用其顺序。否则,让其他所有人对第一个订单按部分具有相同的“11”值。。。之后,按申请日期订购

    依赖于上一组的小数据块。这个不应该让你头疼,也不需要任何工会

    select
          QryRank.*
       from
          ( select
                PreQuery.User_ID,
                usr.user_Name,
                trk.Track,
                PreQuery.LastEnded,
                appEnd.Grade,
                PreQuery.LastPend as Date_Of_Application,
                @Rank := @Rank +1 UserRank
             from
                ( select
                      app.user_id,
                      max( if( app.status = "Ended", date_ended, null ) ) as LastEnded,
                      max( if( app.status = "Pending", app.date_of_application, null )) LastPend
                   from
                      Applications app
                   group by
                      app.user_id ) PreQuery
    
                LEFT JOIN Applications appEnd
                   on PreQuery.User_ID = appEnd.User_ID
                  AND PreQuery.LastEnded = appEnd.date_ended
    
                LEFT JOIN Applications appPend
                   on PreQuery.User_ID = appPend.User_ID
                   AND PreQuery.LastPend = appPend.date_of_application
    
                join Users usr   
                   on PreQuery.user_id = usr.user_id
    
                join Tracking trk
                   on PreQuery.user_id = trk.user_id,
    
                ( select @Rank := 0 ) sqlvars
    
             order by
                appEnd.Grade DESC ) QryRank
        order by
           if( QryRank.UserRank < 11, QryRank.UserRank, 11 ),
           QryRank.Date_Of_Application
    
    选择
    克里兰克*
    从…起
    (选择
    PreQuery.User\u ID,
    usr.user_名称,
    轨道,
    PreQuery.LastEnded,
    附加.职系,
    PreQuery.LastPend作为申请日期,
    @排名:=@Rank+1 UserRank
    从…起
    (选择
    app.user\u id,
    最后结束时的最大值(如果(app.status=“end”,date\u Ended,null),
    最大值(如果(app.status=“Pending”,app.date\u of\u application,null))LastPend
    从…起
    应用程序应用程序
    分组
    app.user_id)预查询
    左连接
    
    ORDER BY cast(replace(replace(td.grade,'(',''),')','') as decimal(12,2)),u.user_id ASC
    
    select
          QryRank.*
       from
          ( select
                PreQuery.User_ID,
                usr.user_Name,
                trk.Track,
                PreQuery.LastEnded,
                appEnd.Grade,
                PreQuery.LastPend as Date_Of_Application,
                @Rank := @Rank +1 UserRank
             from
                ( select
                      app.user_id,
                      max( if( app.status = "Ended", date_ended, null ) ) as LastEnded,
                      max( if( app.status = "Pending", app.date_of_application, null )) LastPend
                   from
                      Applications app
                   group by
                      app.user_id ) PreQuery
    
                LEFT JOIN Applications appEnd
                   on PreQuery.User_ID = appEnd.User_ID
                  AND PreQuery.LastEnded = appEnd.date_ended
    
                LEFT JOIN Applications appPend
                   on PreQuery.User_ID = appPend.User_ID
                   AND PreQuery.LastPend = appPend.date_of_application
    
                join Users usr   
                   on PreQuery.user_id = usr.user_id
    
                join Tracking trk
                   on PreQuery.user_id = trk.user_id,
    
                ( select @Rank := 0 ) sqlvars
    
             order by
                appEnd.Grade DESC ) QryRank
        order by
           if( QryRank.UserRank < 11, QryRank.UserRank, 11 ),
           QryRank.Date_Of_Application