MySQL:首先按降序PK顺序选择10个最新行,然后按字母顺序选择其余记录

时间:2014-02-24 01:58:36

标签: mysql

我有一个简单的表USERS:

 id | name
----+------

你能帮我解决一下从表中获取所有行的查询,并且:

a)将最高PK值的10行放在顶部, id DESC 顺序;

b)按 name ASC 顺序排列所有剩余的行。

谢谢!

2 个答案:

答案 0 :(得分:2)

这是一个棘手的问题。我采取的方法是join方法。使用连接标识第一组的主键(由于您正在使用主键,因此速度非常快)。然后使用该表格匹配order by

select t.*
from table t left outer join
     (select id
      from table t
      order by id desc
      limit 10
     ) t10
     on t.id = t10.id
order by t10.id desc,
         t.name asc;

答案 1 :(得分:0)

第一个问题是:你真的需要在一个查询中吗?我真的没有看到这样的查询的用例诚实。 获取10个最大的id(存储在第10大的某个位置)会更容易,然后按升序名称顺序获取其余的(限制id小于第10大)。

否则在单个查询中,这样的东西会起作用,但对我来说似乎没有效率(也许有人会有更好的想法)。

(
    SELECT 
        id, name 
    from 
        USERS 
    ORDER BY id DESC LIMIT 0,10
)
 UNION
(
    SELECT 
        id, name 
    from 
        USERS 
    WHERE 
        id NOT IN (
            SELECT id, name from USERS ORDER BY id DESC LIMIT 0,10
        )
    ORDER BY name ASC 
)

(或者可能使用NOT EXISTS - 内部查询会有所不同 - 而不是NOT IN