› 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 · Jun 9, 2020 · 4984 views
    This topic created in 2308 days ago, the information mentioned may be changed or developed.
    我在这个网站上训练自己对 query 的理解:
    https://sqlzoo.net/wiki/SELECT_basics

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

    row_number() / rank() over (partition by continent order by population asc/desc)
    MarsBar
        2
    MarsBar  
       Jun 9, 2020
    然后就可以在外面再套一层选择 where row_number/rank >=3 and <=5

    具体是用 row_number, rank or dense_rank 看你的需求了
    MarsBar
        3
    MarsBar  
       Jun 9, 2020
    哦 外层条件别忘了 continent = 'Asia'
    netnr
        4
    netnr  
       Jun 9, 2020
    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  
       Jun 9, 2020
    select * from world where continent = "Asia" order by population desc limit 3 offset 2;
    carryer
        6
    carryer  
       Jun 9, 2020
    SELECT * FROM world WHERE continent = 'Asia' ORDER BY population LIMIT 2,3;
    JieS
        7
    JieS  
       Jun 9, 2020 via iPhone
    @carryer 倒序排列后 limit 靠谱
    xuanbg
        8
    xuanbg  
       Jun 9, 2020
    5 楼,6 楼正解
    oooolongtea
        9
    oooolongtea  
    OP
       Jun 9, 2020
    @aijam @carryer 谢谢 我用了你们的 query,遇到了这个错误: “Incorrect syntax near 'LIMIT'.”

    @netnr 你的 query 可以跑,谢谢!
    cryboy007
        10
    cryboy007  
       Jun 9, 2020
    可以先排序,然后 limit offer
    AmberJiang
        11
    AmberJiang  
       Jun 9, 2020
    窗口函数了解一下 谢谢
    M7w2kh5a58AhKlcT
        12
    M7w2kh5a58AhKlcT  
       Jun 9, 2020
    不知道这个玩意支持的 SQL 标准,MySQL/PG 通常用 limit,offset,ORACLE 用 rownum, 窗口函数 ORACLE,PG 支持
    sarices
        13
    sarices  
       Jun 9, 2020
    @aijam
    @carryer
    并列排名的就不适合了
    oooolongtea
        14
    oooolongtea  
    OP
       Jun 10, 2020
    @netnr “row_number() OVER (ORDER BY population DESC) AS nid” 这里的逻辑是不是把每个 row 都标记成一个 nid,然后你最后用 nid 进行排序?
    netnr
        15
    netnr  
       Jun 10, 2020
    是的,按照指定排序并标记序号,然后按标记序号取
    carryer
        16
    carryer  
       Jun 10, 2020
    @sarices 对,LIMIT 无法处理并列排名。
    @oooolongtea 在 https://sqlzoo.net/wiki/SELECT_basics 试用没出现错误提示,MySQL 类的才支持 LIMIT 。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2199 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 05:01 · PVG 13:01 · LAX 22:01 · JFK 01:01
    ♥ Do have faith in what you're doing.