猿问

MySQL-获取选择的行号

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)


慕沐林林
浏览 2222回答 3
3回答

FFIVE

看一看这,这个.将查询更改为: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 @rn:=@rn+1 AS rank, itemID, ordercountFROM (   SELECT itemID, COUNT(*) AS ordercount  FROM orders  GROUP BY itemID  ORDER BY ordercount DESC) t1, (SELECT @rn:=0) t2;

不负相思意

Swamibebop的解决方案起作用了,但是利用了table.*语法,我们可以避免重复内部的列名。select得到一个更简单/更短的结果:SELECT @r := @r+1 ,         z.* FROM(/* your original select statement goes in here */)z, (SELECT @r:=0)y;所以这会给你:SELECT @r := @r+1 ,         z.* FROM(      SELECT itemID,       count(*) AS ordercount     FROM orders     GROUP BY itemID     ORDER BY ordercount DESC     )z,     (SELECT @r:=0)y;
随时随地看视频慕课网APP
我要回答