Есть таблица мужчин и женщин.
В таблице есть поле, пол которого имеет значения, мужчины или женщины.
TABEL-A
ID SEX GRADE-A GRADE=B
1 men 2 4
2 women 4 5
3 women 6 1
4 men 1 3
5 men 3 6
6 men 5 2
Я хочу отсортировать таблицу, как показано ниже;
Во-первых, перечислите только 2 из мужчин, заказывающих GRADE-A DESC.
Во-вторых, перечислите все остальное от мужчин и женщин, заказываемых GRADE-B DESC
Ожидаемый результат;
ID SEX GRADE-A GRADE=B
6 men 5 2
5 men 3 6
2 women 4 5
1 men 2 4
4 men 1 3
3 women 6 1
Потому что эти 2 условия имеют разные требования к оформлению заказа, поэтому я не смог использовать UNION.
Также UNION работает медленно.
Вот мой неудачный запрос, часть 1
select distinct t.*
(
(
select *
from TABLE-A a
where a.sex = 'men'
order by a.GRADE-A DESC
LIMIT 2
)
UNION ALL
(
select *
from TABLE-A a
order by a.GRADE-B DESC
)
) t
Также я попробовал логику «случай, когда», но сначала не могу ограничить 2 мужчин,
Вот мой неудачный запрос, часть 2
select *
from TABLE-A a
order by
case when a.sex = 'men' then a.GRADE-A end DESC, a.GRADE-B DESC
Может ли кто-нибудь поддержать, чтобы сделать правильный запрос для этого?
С уважением
Попробуйте этот запрос:
SELECT a.*
FROM `TABLE-A` a
LEFT JOIN (
SELECT m2.ID
FROM `TABLE-A` m2
WHERE m2.sex = 'men'
ORDER BY m2.`GRADE-A` DESC
LIMIT 2
) m2 ON m2.ID = a.ID
ORDER BY
CASE WHEN m2.ID IS NULL THEN 1 ELSE 0 END,
CASE WHEN m2.ID IS NULL THEN a.`GRADE-B` ELSE a.`GRADE-A` END DESC
Проверьте это на SQL Fiddle
Объяснение:
Чтобы понять как ORDER BY
работает, смотрите за этим столом — здесь все TABLE-A
данные плюс значения некоторых выражений в запросе (СЛУЧАЙ 1 относится к первому выражению CASE, Вариант 2 — ко второму):
ID SEX GRADE-A GRADE=B m2.ID CASE1 CASE2
1 men 2 4 NULL 1 4
2 women 4 5 NULL 1 5
3 women 6 1 NULL 1 1
4 men 1 3 NULL 1 3
5 men 3 6 5 0 3
6 men 5 2 6 0 5
ORDER BY
сортирует строки по СЛУЧАЙ 1 значения (в порядке возрастания), а затем Вариант 2 (по убыванию). Итак, после сортировки мы имеем то, что ожидается:
ID SEX GRADE-A GRADE=B m2.ID CASE1 CASE2
6 men 5 2 6 0 5
5 men 3 6 5 0 3
2 women 4 5 NULL 1 5
1 men 2 4 NULL 1 4
4 men 1 3 NULL 1 3
3 women 6 1 NULL 1 1
Подробнее о Сортировка строк
select distinct t.*
(
(
select *
from TABLE-A a
where a.sex = 'men'
order by a.GRADE-A DESC
LIMIT 2
)
UNION ALL
(
select *
from TABLE-A a
LEFT OUTER JOIN
(select *
from TABLE-A a
where a.sex = 'men'
order by a.GRADE-A DESC
LIMIT 2) table1
ON a.ID = table1.ID
order by a.GRADE-B DESC
)
) t
это даст вам первый результат запроса и добавит недостающие строки в том порядке, в котором вы хотите