MYSQL-запрос для первых 40 записей и остальных записей - PullRequest
0 голосов
/ 19 января 2019

У меня есть таблица имен 'tbl_featured_professional', где поля:

id,
user_id,
ranking and 
score,
createdDate 

Я хочу, чтобы первые 40 записей были упорядочены по рангу (что является уникальным), а все остальные записи после 40 - по количеству. Я хочу сделать это из MySQL, а не из PHP. Как я могу это сделать? Спасибо.

Ответы [ 4 ]

0 голосов
/ 19 января 2019

Если рейтинг - как следует из его названия - это число, начинающееся с 1 и увеличивающееся, то:

select fp.*
from tbl_featured_professional fp
order by (fp.ranking <= 40) desc,
         (case when fp.ranking <= 40 then ranking end),
         score;
0 голосов
/ 19 января 2019

Использование с 2 подзапросами вместе с UNION ALL и NOT IN должно работать для вас.Первый запрос выберет 40 строк, упорядоченных по ranking, второй запрос с подзапросом выберет все остальные строки кроме первых 40 строк, которые уже выбраны первым подзапросом, и упорядочит егона score.Предложение UNION ALL объединит эти 2 записи подзапроса в один набор.Надеюсь, это поможет и понятно :) сейчас.

 SELECT * FROM tbl_featured_professional ORDER BY ranking LIMIT 40
 UNION ALL
 SELECT * FROM tbl_featured_professional WHERE id NOT IN (SELECT * FROM tbl_featured_professional ORDER BY ranking LIMIT 40) 
 ORDER BY score
0 голосов
/ 19 января 2019

Используйте 2 подзапроса и UNION.
1-й получает лучшие 40, которые заказаны ranking
а 2-й переупорядочивает остальные строки на score:

SELECT * 
FROM tbl_featured_professional
ORDER BY ranking
LIMIT 40
UNION ALL
SELECT * FROM (
  SELECT * FROM (
    SELECT * FROM tbl_featured_professional
    ORDER BY ranking
    LIMIT 40, 18446744073709551615
  )
  ORDER BY score
)

18446744073709551615 = 2^64 - 1, см. this .

0 голосов
/ 19 января 2019

проверьте мое решение

select * from 
(
  select * from tbl_featured_professional
  order by ranking
  limit 40
)
union all
select * from 
(
  select * from tbl_featured_professional
  order by score
  limit 9999999 offset 40
)
...