我有一个简单的表USERS:
id | name
----+------
你能帮我解决一下从表中获取所有行的查询,并且:
a)将最高PK值的10行放在顶部, id DESC
顺序;
b)按 name ASC
顺序排列所有剩余的行。
谢谢!
答案 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
)