我有一个名为“ tbl_featured_professional”的表,其中的字段是:
id,
user_id,
ranking and
score,
createdDate
我想要的是根据排名从前开始排序的40条记录(这是唯一的),而在其他40条之后的所有记录都是按得分排序的。我想从mysql而不是从PHP做到这一点。我怎样才能做到这一点?谢谢。
答案 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 ALL
和NOT 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;