V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
oooolongtea
V2EX  ›  MySQL

自学 sql 中,遇到了一个问题,请教大家:如何在以下 query 里显示排名 3-5 的国家?

  •  
  •   oooolongtea · 2020-06-09 06:56:42 +08:00 · 3759 次点击
    这是一个创建于 1628 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我在这个网站上训练自己对 query 的理解:
    https://sqlzoo.net/wiki/SELECT_basics

    我想知道,如何显示在“Asia”里,“population” 排名 3-5 名的国家?
    16 条回复    2020-06-10 09:47:46 +08:00
    MarsBar
        1
    MarsBar  
       2020-06-09 07:14:23 +08:00
    window function 了解一下

    row_number() / rank() over (partition by continent order by population asc/desc)
    MarsBar
        2
    MarsBar  
       2020-06-09 07:15:43 +08:00
    然后就可以在外面再套一层选择 where row_number/rank >=3 and <=5

    具体是用 row_number, rank or dense_rank 看你的需求了
    MarsBar
        3
    MarsBar  
       2020-06-09 07:16:41 +08:00
    哦 外层条件别忘了 continent = 'Asia'
    netnr
        4
    netnr  
       2020-06-09 07:42:14 +08:00
    SELECT
    *
    FROM (
    SELECT
    name,
    row_number() OVER (ORDER BY population DESC) AS nid
    FROM
    world
    WHERE
    continent = 'Asia') T
    WHERE
    nid BETWEEN 3 AND 5
    aijam
        5
    aijam  
       2020-06-09 08:11:04 +08:00
    select * from world where continent = "Asia" order by population desc limit 3 offset 2;
    carryer
        6
    carryer  
       2020-06-09 08:19:24 +08:00
    SELECT * FROM world WHERE continent = 'Asia' ORDER BY population LIMIT 2,3;
    JieS
        7
    JieS  
       2020-06-09 08:23:44 +08:00 via iPhone
    @carryer 倒序排列后 limit 靠谱
    xuanbg
        8
    xuanbg  
       2020-06-09 08:42:40 +08:00
    5 楼,6 楼正解
    oooolongtea
        9
    oooolongtea  
    OP
       2020-06-09 12:27:26 +08:00
    @aijam @carryer 谢谢 我用了你们的 query,遇到了这个错误: “Incorrect syntax near 'LIMIT'.”

    @netnr 你的 query 可以跑,谢谢!
    cryboy007
        10
    cryboy007  
       2020-06-09 12:36:06 +08:00
    可以先排序,然后 limit offer
    AmberJiang
        11
    AmberJiang  
       2020-06-09 15:27:04 +08:00
    窗口函数了解一下 谢谢
    nnd
        12
    nnd  
       2020-06-09 15:38:18 +08:00
    不知道这个玩意支持的 SQL 标准,MySQL/PG 通常用 limit,offset,ORACLE 用 rownum, 窗口函数 ORACLE,PG 支持
    sarices
        13
    sarices  
       2020-06-09 15:43:25 +08:00
    @aijam
    @carryer
    并列排名的就不适合了
    oooolongtea
        14
    oooolongtea  
    OP
       2020-06-10 02:45:52 +08:00
    @netnr “row_number() OVER (ORDER BY population DESC) AS nid” 这里的逻辑是不是把每个 row 都标记成一个 nid,然后你最后用 nid 进行排序?
    netnr
        15
    netnr  
       2020-06-10 06:31:37 +08:00
    是的,按照指定排序并标记序号,然后按标记序号取
    carryer
        16
    carryer  
       2020-06-10 09:47:46 +08:00
    @sarices 对,LIMIT 无法处理并列排名。
    @oooolongteahttps://sqlzoo.net/wiki/SELECT_basics 试用没出现错误提示,MySQL 类的才支持 LIMIT 。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2734 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 12:06 · PVG 20:06 · LAX 04:06 · JFK 07:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.