行号和不同的一起

时间:2012-10-30 19:28:09

标签: 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这个查询?

4 个答案:

答案 0 :(得分:5)

SELECT @rownum := @rownum + 1 AS row_number,
       table1.name
FROM   (SELECT DISTINCT name
        FROM   sparkles) table1
       JOIN (SELECT @rownum := 0) r

将产生:

| ROW_NUMBER |   NAME |
-----------------------
|          1 |   John |
|          2 | Robert |

See it in action

答案 1 :(得分:1)

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

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

请参阅SQL Fiddle with Demo

结果:

|   NAME | N |
--------------
|   Jhon | 1 |
| Robert | 2 |

答案 2 :(得分: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应用于整个结果。由于每一行都保证具有不同的值n,因此DISTINCT无效。

其他答案描述了在派生表(子查询)中执行DISTINCT,以便它仅基于name的不同值强制减少行,然后应用递增变量到结果行。

答案 3 :(得分:0)

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

SELECT @n := @n + 1 AS n,  name from (select DISTINCT  name FROM table1) tb;