给出表“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这个查询?
答案 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 |
答案 1 :(得分:1)
目前还不清楚你在问什么,但是,你的意思是这样的:
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 |
答案 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;