1

给定表“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这个查询?

4

4 回答 4

5
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 |

See it in action

于 2012-10-30T19:33:07.360 回答
1

为什么 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,然后将递增变量应用于结果行。

于 2012-10-30T19:39:29.640 回答
1

目前尚不清楚您在问什么,但是您的意思是这样的:

select name, @rn:=@rn+1 n
from
(
  select distinct name
  from table1
) t1, (SELECT @rn:=0) r
order by name

请参阅带有演示的 SQL Fiddle

结果:

|   NAME | N |
--------------
|   Jhon | 1 |
| Robert | 2 |
于 2012-10-30T19:30:20.597 回答
0

当我探索没有像Row Number()MS SQL 中那样的函数时,我也遇到了同样的问题,然后我尝试了以下技巧,它对我有用

SELECT @n := @n + 1 AS n,  name from (select DISTINCT  name FROM table1) tb;
于 2015-01-30T03:22:42.963 回答