mysql: Как можно перечислить 2 разных условия, упорядочить и ограничить требования из одной таблицы?

Есть таблица мужчин и женщин.
В таблице есть поле, пол которого имеет значения, мужчины или женщины.

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

Может ли кто-нибудь поддержать, чтобы сделать правильный запрос для этого?

С уважением

2

Решение

Попробуйте этот запрос:

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

Подробнее о Сортировка строк

2

Другие решения

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

это даст вам первый результат запроса и добавит недостающие строки в том порядке, в котором вы хотите

0

По вопросам рекламы [email protected]