如果项目已排序,我可以运行select语句并获取行号吗?

我有一张这样的桌子:

mysql> describe orders;
+-------------+---------------------+------+-----+---------+----------------+
| Field       | Type                | Null | Key | Default | Extra          |
+-------------+---------------------+------+-----+---------+----------------+
| orderID     | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| itemID      | bigint(20) unsigned | NO   |     | NULL    |                |
+-------------+---------------------+------+-----+---------+----------------+

然后,我可以运行此查询以按ID获取订单数量:

SELECT itemID, COUNT(*) as ordercount
FROM orders
GROUP BY itemID ORDER BY ordercount DESC;

这给了我一个表中每itemID个的计数,如下所示:

+--------+------------+
| itemID | ordercount |
+--------+------------+
|    388 |          3 |
|    234 |          2 |
|   3432 |          1 |
|    693 |          1 |
|   3459 |          1 |
+--------+------------+

我也想得到行号,这样我就可以知道itemID=388是第一行,234是第二行,等等(基本上是订单的排名,而不仅仅是原始计数).我知道当我得到结果集时,我可以用Java来做这件事,但我想知道是否有一种方法可以完全用SQL来处理它.

Update

设置排名会将其添加到结果集中,但顺序不正确:

mysql> SET @rank=0;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @rank:=@rank+1 AS rank, itemID, COUNT(*) as ordercount
    -> FROM orders
    -> GROUP BY itemID ORDER BY rank DESC;
+------+--------+------------+
| rank | itemID | ordercount |
+------+--------+------------+
|    5 |   3459 |          1 |
|    4 |    234 |          2 |
|    3 |    693 |          1 |
|    2 |   3432 |          1 |
|    1 |    388 |          3 |
+------+--------+------------+
5 rows in set (0.00 sec)

推荐答案

看看this.

将查询更改为:

SET @rank=0;
SELECT @rank:=@rank+1 AS rank, itemID, COUNT(*) as ordercount
  FROM orders
  GROUP BY itemID
  ORDER BY ordercount DESC;
SELECT @rank;

最后一个 Select 是你的计数.

Mysql相关问答推荐

将具有多个结果的表连接为新列?

我可以在插件中访问SQL密钥对吗?

mysql查询汇总数据

MySQL 8.0.28覆盖(和函数)索引未使用

查找关联数据库表的超集

SQL - Select 复合主键,条件为其中一个主键

Python MySQL-无法从数据库中删除行

MySQL全文索引和不区分大小写搜索带来的挑战

带有 JOIN 和 WHERE 子句的 INSERT 语句

仅当 SELECT 语句在 MySQL 中给出空集时才执行 UPDATE 语句

检索按键列值分组的最新日期 (MySql)

如何显示患者预约中的专业人员姓名?

MySQL UPDATE 锁会因为连续的 SHARE 锁而饿死吗?

为什么在有 BEGIN 和 END 时为存储过程指定分隔符?

将相同的固定值插入多行

从终端访问 MAMP 的 MySQL

PHP 判断 NULL

将 MySQL 数据库置于版本控制之下?

MySQL - 基于同一表中的行求和列值

如何通过一个语句描述数据库中的所有表?