MySQL - 获取选择的行号
如果项目已排序,我可以运行 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 中处理它。
更新
设置排名会将其添加到结果集中,但排序不正确:
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)
Can I run a select statement and get the row number if the items are sorted?
I have a table like this:
mysql> describe orders;
+-------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------------------+------+-----+---------+----------------+
| orderID | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| itemID | bigint(20) unsigned | NO | | NULL | |
+-------------+---------------------+------+-----+---------+----------------+
I can then run this query to get the number of orders by ID:
SELECT itemID, COUNT(*) as ordercount
FROM orders
GROUP BY itemID ORDER BY ordercount DESC;
This gives me a count of each itemID
in the table like this:
+--------+------------+
| itemID | ordercount |
+--------+------------+
| 388 | 3 |
| 234 | 2 |
| 3432 | 1 |
| 693 | 1 |
| 3459 | 1 |
+--------+------------+
I want to get the row number as well, so I could tell that itemID=388
is the first row, 234
is second, etc (essentially the ranking of the orders, not just a raw count). I know I can do this in Java when I get the result set back, but I was wondering if there was a way to handle it purely in SQL.
Update
Setting the rank adds it to the result set, but not properly ordered:
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)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
它现在内置于 MySQL 8.0 和 MariaDB 10.2 中:
It's now builtin in MySQL 8.0 and MariaDB 10.2:
如果有人想尝试使用单个查询的更简洁的方法,那么这可能是一个解决方案。
在这种情况下,您不需要指定默认为 null 的初始值,并且此
IFNULL
检查将为此查询分配0
值。If someone wants to try a cleaner approach with a single query then this can be a solution.
In this case, you don't need specify the initial value which will be null by default and this
IFNULL
check will assign value of0
with this query.看看这个。
将您的查询更改为:
最后一个选择是您的计数。
Take a look at this.
Change your query to:
The last select is your count.
Swamibebop 的解决方案有效,但通过利用
table.*
语法,我们可以避免重复内部select
的列名并获得更简单/更短的结果:这样会给你:
Swamibebop's solution works, but by taking advantage of
table.*
syntax, we can avoid repeating the column names of the innerselect
and get a simpler/shorter result:So that will give you:
您可以使用 MySQL 变量来完成此操作。像这样的东西应该可以工作(尽管它由两个查询组成)。
You can use MySQL variables to do it. Something like this should work (though, it consists of two queries).