MYSQL查询前40条记录,否则记录

时间:2019-01-19 13:24:03

标签: mysql sql limit offset

我有一个名为“ tbl_featured_professional”的表,其中的字段是:

id,
user_id,
ranking and 
score,
createdDate 

我想要的是根据排名从前开始排序的40条记录(这是唯一的),而在其他40条之后的所有记录都是按得分排序的。我想从mysql而不是从PHP做到这一点。我怎样才能做到这一点?谢谢。

4 个答案:

答案 0 :(得分:0)

检查我的解决方案

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
)

答案 1 :(得分:0)

与2个子查询以及UNION ALLNOT IN一起使用应该适合您。 第一个查询将选择ranking排序的40行,带子查询的第二个查询将选择所有其他行除了,第一个子查询已选择的前40行并按score订购。 UNION ALL子句会将这两个子查询记录合并为一个集合。希望这会有所帮助并且可以理解:)。

 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

答案 2 :(得分:0)

使用2个子查询和UNION
第一名获得ranking排序的前40名
然后第二个按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

答案 3 :(得分:0)

如果排名-顾名思义-是一个从1开始并递增的数字,则:

select fp.*
from tbl_featured_professional fp
order by (fp.ranking <= 40) desc,
         (case when fp.ranking <= 40 then ranking end),
         score;