高级mysql查询,对结果集上的特定记录进行排序,而不管其默认排序?

时间:2015-06-26 04:30:10

标签: mysql sql database sorting

我有一个查询,它实际上使用order by子句进行排序。我有一张如下表......

user_id   user_name   user_age   user_state   user_points 
1         Rakul       30         CA           56
2         Naydee      29         NY           144
3         Jeet        40         NJ           43
.....

我有以下查询...

select * from users where user_state = 'NY' order by user_points desc limit 50;

这给了我50个人点数最多的名单。我想最不喜欢那些知道身份的人。如果我没有足够的50条记录,那么这些id应该列在列表的最后一条。我不希望用户2和3成为列表的顶部,即使他们有更高的分数......那些人应该来自查询列表的最后一个。是否有任何方法可以将特定记录推送到结果集上而不管查询排序?

2 个答案:

答案 0 :(得分:0)

如果要将特定记录(如user_id = 2和3)向下移动到列表中;然后你可以在Query:

下面运行
mysql> select *,IF(user_id=2 or user_id=3,0,1) as list_order from users where user_state = 'NY' order by list_order desc, user_points desc limit 50;

答案 1 :(得分:0)

select * from (
    select *
    from users
    where user_state = 'NY'
    -- this order by ensures that 2 and 3 are included
    order by case when user_id in (2,3) then 1 else 2 end, user_points desc
    limit 50
) as top48plus2n3
-- this order by ensures that 2 and 3 are last
order by case when user_id in (2,3) then 2 else 1 end, user_points desc

修改id更改user_id并在order by之外更正(对不起)

在内部选择:
通过使用此case计算,您所做的是确保ID等于2和3的记录是“重要的”(首先按顺序排序)。那些收到1而其他人收到2作为订单价值,只有在这些点相关之后。

在外部选择:
ids 2和3的记录收到2作为订单价值,而其余的收到1.因此,无论其“默认”,它们都是最后的

这里有一个简化的小提琴http://sqlfiddle.com/#!9/377c1/1