【问题标题】:Mysql limit, but with adding some more rowsMysql 限制,但添加了更多行
【发布时间】:2016-12-12 18:15:44
【问题描述】:

我有这张桌子:

name   | age
John   | 35
Amanda | 34
Jane   | 34
Jack   | 34
Craig  | 32
Jason  | 32
Phil   | 32
Kris   | 32
Tyler  | 25
Harry  | 25
Duke   | 24

我想按年龄 desc 排序并选择前五行。但如果有更多与第 5 行相同年龄的人,我也希望他们出现在我的结果中。类似于:(SELECT * FROM people ORDER BY age DESC LIMIT 0, 5 as W) UNION (SELECT * FROM people WHERE age = W[4].age)

所以上面例子的结果是:

John   | 35
Amanda | 34
Jane   | 34
Jack   | 34
Craig  | 32
Jason  | 32
Phil   | 32
Kris   | 32
  • 约翰、阿曼达、简、杰克、克雷格在结果中,因为有前五个最老的
  • Jason、Phil、Kris 出现在结果中,因为他们与第五排的年龄相同

有什么办法吗?非常感谢

【问题讨论】:

    标签: mysql


    【解决方案1】:
    DROP TABLE IF EXISTS my_table;
    
    CREATE TABLE my_table
    (name VARCHAR(12) NOT NULL PRIMARY KEY
    ,age INT NOT NULL)
    ;
    
    INSERT INTO my_table VALUES
    ('John'   ,35),
    ('Amanda' ,34),
    ('Jane'   ,34),
    ('Jack'   ,34),
    ('Craig'  ,32),
    ('Jason'  ,32),
    ('Phil'   ,32),
    ('Kris'   ,32),
    ('Tyler'  ,25),
    ('Harry'  ,25),
    ('Duke'   ,24);
    
    SELECT DISTINCT y.*
               FROM
                  ( SELECT *
                      FROM my_table
                     ORDER
                        BY age DESC
                     LIMIT 5
                  ) x
               JOIN my_table y
                 ON y.age = x.age;
    +--------+-----+
    | name   | age |
    +--------+-----+
    | John   |  35 |
    | Amanda |  34 |
    | Jane   |  34 |
    | Jack   |  34 |
    | Craig  |  32 |
    | Jason  |  32 |
    | Phil   |  32 |
    | Kris   |  32 |
    +--------+-----+
    

    SQL DEMO

    【讨论】:

    • 你用什么来格式化表格?我用的那个现在离线了
    • @JuanCarlosOropeza 我只使用我的命令行界面和 TextPad。
    【解决方案2】:

    如果你尝试一下会怎样

    SELECT * FROM people
    WHERE Age IN (SELECT DISTINCT Age FROM people ORDER BY Age DESC LIMIT 5)
    

    【讨论】:

    • @JuanCarlosOropeza,是的,有道理
    【解决方案3】:

    您必须使用内部查询来选择前 5 个年龄,然后倒序选择最后一个。

    使用Limit 4, 1跳过前4个并选择最后一个

    SQL DEMO

    SELECT *
    FROM (SELECT * 
          FROM people 
          ORDER BY age DESC 
          LIMIT 5 ) as w
    UNION 
    SELECT * 
    FROM people 
    WHERE age = (SELECT age
                 FROM Table1
                 ORDER BY `age` DESC
                 LIMIT 4, 1)
    

    输出

    【讨论】:

    • @Strawberry 我敢打赌,仍在寻找解决方法,但尚未找到。 :(随时发布另一个答案
    • @Strawberry 不确定 LIMIT 如何使用两个参数可能是 LIMIT 4, 5
    • @Strawberry 不,你是对的,让我检查文档LIMIT 4, 1 跳过 4 并选择最后一个
    • 输出是我唯一不喜欢 rextester 的地方 - 哦,还有右边那个烦人的广告。
    • @Strawberry 对于输出,我使用snag it,所以只是复制粘贴,广告不会让我很困扰,我的右眼视力有限。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-10
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多