sql - MySQL View 中的行排名

标签 sql mysql view ranking

我需要创建一个自动在结果中添加虚拟行号的 View 。这里的图表是完全随机的,我想要实现的是动态创建的最后一列。

> +--------+------------+-----+
> | id     | variety    | num |
> +--------+------------+-----+
> | 234    | fuji       |   1 |
> | 4356   | gala       |   2 |
> | 343245 | limbertwig |   3 |
> | 224    | bing       |   4 |
> | 4545   | chelan     |   5 |
> | 3455   | navel      |   6 |
> | 4534345| valencia   |   7 |
> | 3451   | bartlett   |   8 |
> | 3452   | bradford   |   9 |
> +--------+------------+-----+

查询:

SELECT id, 
       variety, 
       SOMEFUNCTIONTHATWOULDGENERATETHIS() AS num 
  FROM mytable

最佳答案

使用:

SELECT t.id,
       t.variety,
       (SELECT COUNT(*) FROM TABLE WHERE id < t.id) +1 AS NUM
  FROM TABLE t

这不是执行此操作的理想方式,因为对 num 值的查询将针对返回的每一行执行。一个更好的主意是创建一个 NUMBERS 表,其中包含一个从 1 开始递增到一个非常大的数字的单列,然后加入并引用 NUMBERS表的方式类似于下面的变量示例。

MySQL 排名,或缺乏排名

您可以定义一个变量以获得伪行号功能,因为 MySQL 没有任何排名函数:

SELECT t.id,
       t.variety,
       @rownum := @rownum + 1 AS num
  FROM TABLE t,
       (SELECT @rownum := 0) r
  • SELECT @rownum := 0 定义变量,并将其设置为零。
  • r 是一个子查询/表别名,因为如果您不为子查询定义别名,即使您不使用它,您也会在 MySQL 中遇到错误。

不能在 MySQL View 中使用变量

如果这样做,您将收到 1351 错误,因为 you can't use a variable in a view due to design . bug/feature behavior is documented here .

关于sql - MySQL View 中的行排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1964811/

相关文章:

mysql - 将表从一个数据库复制到另一个数据库,维护表的结构并重命名它

sql - WHERE 子句中的 IF/Else/CASE 语句

mysql - 无法通过tomcat连接远程mysql

mysql - SQL:将 View 连接到表以进行查询

Android - 使用 ImageView 优于简单 View 的背景属性的优势

javascript - Express JS 将变量传递给 Javascript 文件

sql - 使用 IN 和 OUT 参数调用 Oracle 中的存储过程

sql - MYSQL优化&问题

mysql - Sequelize 为 DATE 类型创建 SQL

php - 使用 PHP 从 JSON 数组解析营业时间、时段和工作日