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