【发布时间】:2019-06-13 12:29:39
【问题描述】:
我有一个表名“tbl_featured_professional”,其中字段是:
id,
user_id,
ranking and
score,
createdDate
我想要的是前 40 条记录按排名排序(这是唯一的),40 条之后的所有其他记录按分数排序。我想从 mysql 而不是 PHP 来做。我怎样才能做到这一点?谢谢。
【问题讨论】:
我有一个表名“tbl_featured_professional”,其中字段是:
id,
user_id,
ranking and
score,
createdDate
我想要的是前 40 条记录按排名排序(这是唯一的),40 条之后的所有其他记录按分数排序。我想从 mysql 而不是 PHP 来做。我怎样才能做到这一点?谢谢。
【问题讨论】:
检查我的解决方案
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
)
【讨论】:
offset 40是score排序时的偏移量,可能与ranking排序的前40个不同
limit 9999999 offset 40。你认为问题是什么?
与UNION ALL 和NOT IN 一起使用2 个子查询应该适合您。
第一个查询将选择由ranking 排序的 40 行,带有子查询的第二个查询将选择所有其他行除了第一个子查询和排序已经选择的前 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
【讨论】:
使用 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。
【讨论】:
如果排名——顾名思义——是一个从 1 开始并递增的数字,那么:
select fp.*
from tbl_featured_professional fp
order by (fp.ranking <= 40) desc,
(case when fp.ranking <= 40 then ranking end),
score;
【讨论】: