给定表“table1”
name
------
Jhon
Jhon
Robert
Robert
Robert
需要获取唯一名称和数字名称作为队列,即结果为:
1 Jhon
2 Robert
此查询不起作用
SET @n = 0;
SELECT @n := @n + 1 AS n, DISTINCT name FROM table1
我不问怎么做,(这可能是用子查询来做的吧?),我的问题是:为什么不工作查询,我在楼上写的?为什么不喜欢mysql这个查询?
给定表“table1”
name
------
Jhon
Jhon
Robert
Robert
Robert
需要获取唯一名称和数字名称作为队列,即结果为:
1 Jhon
2 Robert
此查询不起作用
SET @n = 0;
SELECT @n := @n + 1 AS n, DISTINCT name FROM table1
我不问怎么做,(这可能是用子查询来做的吧?),我的问题是:为什么不工作查询,我在楼上写的?为什么不喜欢mysql这个查询?
SELECT @rownum := @rownum + 1 AS row_number,
table1.name
FROM (SELECT DISTINCT name
FROM sparkles) table1
JOIN (SELECT @rownum := 0) r
Will produce:
| ROW_NUMBER | NAME | ----------------------- | 1 | John | | 2 | Robert |
为什么 MySQL 不喜欢这个查询:
SELECT @n := @n + 1 AS n, DISTINCT name FROM table1
此查询不正确,因为 SQL 的DISTINCT
查询修饰符适用于整行,而不仅仅是单个列或列的子集。这是 SQL 程序员常见的误解。
换句话说,DISTINCT
只有当所有列都与另一行相同时,结果才会减少。
在语法上,DISTINCT
关键字必须跟在SELECT
. 放在其他列之后是不正确的。
您可以编写以下内容:
SELECT DISTINCT @n := @n + 1 AS n, name FROM table1
但是这个查询不会得到你想要的。它将递增变量应用于table1 的每一行,然后应用于DISTINCT
整个结果。由于保证每一行都有一个不同的 value n
,所以DISTINCT
不会有任何效果。
其他答案描述了DISTINCT
在派生表(子查询)内部进行操作,以便仅根据 的不同值强制减少行name
,然后将递增变量应用于结果行。
目前尚不清楚您在问什么,但是您的意思是这样的:
select name, @rn:=@rn+1 n
from
(
select distinct name
from table1
) t1, (SELECT @rn:=0) r
order by name
结果:
| NAME | N |
--------------
| Jhon | 1 |
| Robert | 2 |
当我探索没有像Row Number()
MS SQL 中那样的函数时,我也遇到了同样的问题,然后我尝试了以下技巧,它对我有用
SELECT @n := @n + 1 AS n, name from (select DISTINCT name FROM table1) tb;