代码之家  ›  专栏  ›  技术社区  ›  revo shanwije

另一个MySQL MAX()问题

  •  2
  • revo shanwije  · 技术社区  · 11 年前

    我有一个动态SQL查询:

    SET @a=(SELECT MAX(ID) FROM table);
    PREPARE STMT FROM 'SELECT * FROM table ORDER BY id DESC LIMIT 0, ?';
    EXECUTE STMT USING @a;
    

    正如预期的那样,这是正确的。然而,我想从中减去最后5行 查询

    所以我用了两种方法:

    1- SET @a=(SELECT (MAX(ID)-5) FROM table);

    2- SET @a := @a-5;

    奇怪的是,它运行了,但结果与完整的查询没有任何区别,并且所有行都被提取了!

    非常感谢对这个话题的任何解释。

    更新#1

    最后一个没有差距 20 行,如果我更改 5 到一个更大的数字,比如 200 结果是一样的。

    更新#2

    SELECT COUNT(*), MAX(ID) FROM table 输出 211 对于 COUNT(*) & 577 对于 MAX(ID)

    所以如果我改变 5. 400 它有效,但不包括 第一 34 结果中的ID。同样,这种排斥的方式也适用于@Laurence的回答。

    更新#3

    将这些ID视为 table 桌子

    | ID |
    +----+
    | 55 |
    | 54 |
    | 53 |
    | 52 |
    | 51 |
    

    请参阅以下查询更改的结果(按照我的定义,顺序为DESC):

    # @a is MAX(id) = 55
    
    SET @a := @a-5;
        => query: SELECT * FROM table ORDER BY id DESC LIMIT 0, 55-5/*50*/ -- no effects in result
    
    SET @a := @a-50;
        => query: SELECT * FROM table ORDER BY id DESC LIMIT 0, 55-50/*5*/ -- no effects in result
    
    SET @a := @a-51;
        => query: SELECT * FROM table ORDER BY id DESC LIMIT 0, 55-51/*4*/ -- will exclude row `51` from the result so `55, 54, 53, 52` are fetched 
    
    1 回复  |  直到 11 年前
        1
  •  0
  •   Laurence    11 年前

    似乎您想排除最高的5个id,并按id降序对结果进行排序。要做到这一点,您可以将限制从5:

    Set @a = (Select Count(*) From table);
    Prepare stmt From 'Select * From table Order By id desc Limit 5, ?';
    Execute stmt Using @a;
    

    要了解这是如何工作的,请想象在应用限制之前的结果(仅id):

    55, 54, 53, 52, 51, 50, 49, ...
    

    Limit 5, n 表示从第6行开始返回n行,即

    50, 49, ...
    

    在这里 @a 只需要足够大就可以得到所有的结果。你可以使用一个很大的数字,而不用担心精确性。假设id是唯一的, max(id) count(*) 在这种情况下会这样做。