带有 LIMIT 和 OFFSET 的 SQL 排序依据。一次对每个匹配的行进行排序

Posted

技术标签:

【中文标题】带有 LIMIT 和 OFFSET 的 SQL 排序依据。一次对每个匹配的行进行排序【英文标题】:SQL Order By with LIMIT and OFFSET. SORT every matched rows at once 【发布时间】:2013-05-09 10:22:44 【问题描述】:

我想在 ORDER BY 的帮助下创建 SQL 排序查询。我使用 LIMIT 和 OFFSET 关键字拆分结果,因此在查询单个页面后显示 10 个项目。问题是我必须对所有匹配的行使用 ORDER BY,而不仅仅是在每个查询中拆分(和偏移)10 个结果。在我的脚本中,我必须将数据分为两类,因此我需要使用 UNION。

看:

SELECT * FROM (
    (SELECT n.name, n.id, n.type 
        FROM states AS n 
        WHERE
            n.lang = :lang AND 
                n.cat = 1
        ORDER BY
            n.id DESC
        LIMIT
            10 OFFSET :offset) 
        UNION 
        (SELECT n.name, n.id
        FROM states AS n 
        WHERE
            n.lang = :lang AND
                n.cat = 2
        ORDER BY
            n.id DESC
        LIMIT
            10 OFFSET :offset) 
    UNION) AS n ORDER BY n.type, n.name ASC

查看结果是否按名称 ASC 正确排序,但仅适用于 10 个结果。如果查询匹配例如。 100 行总是每 10 行按 A-Z 排序 - 这不是我想要的。有没有办法做到这一点?

也许我应该获取所有匹配的行,然后使用 php 函数对其进行拆分和排序?

【问题讨论】:

不要把 LIMIT 放在你的内部 SELECT 上,把它放在外部 SELECT 上;为什么要对内部和外部 SELECT 进行排序? 注意这个问题与PHP无关,所以不应该标记为PHP 问题已编辑。也许这个问题需要一个php解决方案。我不知道... 在数据库上排序 - 数据库排序好 请给我一个线索:如何。 【参考方案1】:
SELECT n.name, n.id, n.type 
  FROM states AS n 
 WHERE n.lang = :lang AND 
       n.cat IN (1, 2)
 ORDER BY n.type, n.name ASC
 LIMIT 10 OFFSET :offset

【讨论】:

如果可能,每个类别的结果应该相同。

以上是关于带有 LIMIT 和 OFFSET 的 SQL 排序依据。一次对每个匹配的行进行排序的主要内容,如果未能解决你的问题,请参考以下文章

SQL(ORACLE):ORDER BY 和 LIMIT [重复]

使用 SQL LIMIT 和 OFFSET 查询选择所有记录

SQL之LIMIT ,OFFSET

SQL查询语句中的 limit 与 offset

mysql --limit和offset区别

sql 中 limit 与 limit,offset连用的区别