Вы, вероятно, пытаетесь сделать слишком много в одном запросе здесь.
В любом случае, если вы хотите, чтобы что-то повредило ваши глаза:
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;
Это делает следующие предположения:
- Всегда есть только одна строка для каждого user_id в
users
и
tracking
стол
EDIT
Чтобы объяснить этот запрос немного:
Встроенный просмотр с псевдонимом a
(он же «The Top Half») возвращает список из 10 лучших пользователей в соответствии с их последним возрастанием по окончанию класса. Обратите внимание на следующую часть запроса, которая убирает все скобки из оценки, преобразует полученное число в десятичное или 2 десятичных разряда и упорядочивает их по возрастанию по классу, а затем, в случае равных баллов, по user_id:
ORDER BY cast(replace(replace(td.grade,'(',''),')','') as decimal(12,2)),u.user_id ASC
Встроенное представление b
во многом аналогично встроенному представлению a
, за исключением того, что исключает пользователей, которые появятся в верхней половине, и упорядочивает результаты по статусу DESC
(чтобы переместить пользователей без приложений в нижнюю часть). списка) и дата подачи заявки ASC
.