zoukankan      html  css  js  c++  java
  • 为你的Mysql排序查询增加一个排序号

    排序号,在需要排序的查询中比较常见,今天再一次遇到这种场景,不常写,所以上手比较生疏,记录一下,或许对更多的人也有用处。

    起初在网上进行了一下简单的搜索,但是文章都挺乱,可读性都不太高,经过一番调查,结合官网文档对此类场景做如下描述:

    • 使用mysql变量定义语法
    • 每一行对定义好的变量进行+1
    • 同一个sql中如果出现union,或者子查询,变量名称需要不同。

    示例代码:

    select
        @rank_8 := @rank_8 + 1 AS rank_no,
       ...
      from   a,(SELECT @rank_8 := 0) b
       where ...
      order by xxx desc limit 15

    代码说明:

    • 将变量定义使用一个简单的子查询b
    • b会优先定义该变量,然后就可以在外层查询中进行引用操作了。

    附上官网变量使用文档:

    12.3.4 Assignment Operators

     

    Table 12.5 Assignment Operators

    NameDescription
    = Assign a value (as part of a SET statement, or as part of the SET clause in an UPDATE statement)
    := Assign a value

     

    • :=

      Assignment operator. Causes the user variable on the left hand side of the operator to take on the value to its right. The value on the right hand side may be a literal value, another variable storing a value, or any legal expression that yields a scalar value, including the result of a query (provided that this value is a scalar value). You can perform multiple assignments in the same SET statement. You can perform multiple assignments in the same statement.

      Unlike =, the := operator is never interpreted as a comparison operator. This means you can use := in any valid SQL statement (not just in SET statements) to assign a value to a variable.

      mysql> SELECT @var1, @var2;
              -> NULL, NULL
      mysql> SELECT @var1 := 1, @var2;
              -> 1, NULL
      mysql> SELECT @var1, @var2;
              -> 1, NULL
      mysql> SELECT @var1, @var2 := @var1;
              -> 1, 1
      mysql> SELECT @var1, @var2;
              -> 1, 1
      
      mysql> SELECT @var1:=COUNT(*) FROM t1;
              -> 4
      mysql> SELECT @var1;
              -> 4

      You can make value assignments using := in other statements besides SELECT, such as UPDATE, as shown here:

      mysql> SELECT @var1;
              -> 4
      mysql> SELECT * FROM t1;
              -> 1, 3, 5, 7
      
      mysql> UPDATE t1 SET c1 = 2 WHERE c1 = @var1:= 1;
      Query OK, 1 row affected (0.00 sec)
      Rows matched: 1  Changed: 1  Warnings: 0
      
      mysql> SELECT @var1;
              -> 1
      mysql> SELECT * FROM t1;
              -> 2, 3, 5, 7

      While it is also possible both to set and to read the value of the same variable in a single SQL statement using the:= operator, this is not recommended. Section 9.4, “User-Defined Variables”, explains why you should avoid doing this.

    • =

      This operator is used to perform value assignments in two cases, described in the next two paragraphs.

      Within a SET statement, = is treated as an assignment operator that causes the user variable on the left hand side of the operator to take on the value to its right. (In other words, when used in a SET statement, = is treated identically to :=.) The value on the right hand side may be a literal value, another variable storing a value, or any legal expression that yields a scalar value, including the result of a query (provided that this value is a scalar value). You can perform multiple assignments in the same SET statement.

      In the SET clause of an UPDATE statement, = also acts as an assignment operator; in this case, however, it causes the column named on the left hand side of the operator to assume the value given to the right, provided any WHERE conditions that are part of the UPDATE are met. You can make multiple assignments in the same SET clause of an UPDATE statement.

      In any other context, = is treated as a comparison operator.

      mysql> SELECT @var1, @var2;
              -> NULL, NULL
      mysql> SELECT @var1 := 1, @var2;
              -> 1, NULL
      mysql> SELECT @var1, @var2;
              -> 1, NULL
      mysql> SELECT @var1, @var2 := @var1;
              -> 1, 1
      mysql> SELECT @var1, @var2;
              -> 1, 1

      For more information, see Section 13.7.4.1, “SET Syntax for Variable Assignment”Section 13.2.11, “UPDATE Syntax”, and Section 13.2.10, “Subquery Syntax”.

     

     

     

  • 相关阅读:
    gbin1分享: jQuery UI 1.9带给我们的惊喜
    7个优秀的javascript资源
    转载:仅需78美元,你就能拥有一个iPhone机器人Romo
    GBin1推荐:使用时间轴插件Timelinr创建超酷jQuery时间轴(Time line)
    GBin1分享:10个帮助你精通Firebug控制台的技巧
    GBin1分享:jQuery1.7 Beta 预览
    批处理文件安装卸载window服务程序的技巧
    当前不会命中断点 还没有为该文档加载任何符号
    HttpModule,HttpHandler,HttpHandlerFactory简单使用
    VS2010 .net Windows服务程序 重复性 注册反注册
  • 原文地址:https://www.cnblogs.com/sunlightlee/p/10871152.html
Copyright © 2011-2022 走看看