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

私はこれを作成する方法を尋ねません(これはサブクエリで作成される可能性がありますか?)、私の質問は:なぜ私が2階に書いたクエリを機能させないのですか?なぜこのクエリを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

生成されます:

| ROW_NUMBER | 名前|
-----------------------
| 1 | ジョン|
| 2 | ロバート|

実際に見てください

于 2012-10-30T19:33:07.360 に答える
1

あなたが何を求めているのかは正確には明確ではありませんが、あなたはこのようなことを意味しますか?

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

SQL FiddlewithDemoを参照してください

結果:

|   NAME | N |
--------------
|   Jhon | 1 |
| Robert | 2 |
于 2012-10-30T19:30:20.597 に答える
1

MySQLがこのクエリを好まない理由:

SELECT @n := @n + 1 AS n,  DISTINCT  name FROM table1

DISTINCTSQLのクエリ修飾子は、単一の列または列のサブセットだけでなく、行全体に適用されるため、このクエリは正しくありません。これは、SQLプログラマーによる一般的な誤解です。

つまり、すべての列が別の行と同じであるDISTINCT場合にのみ、結果が減少します。

構文的には、DISTINCTキーワードはに続く必要がありますSELECT。他の列の後に置くのは正しくありません。

あなたは次のように書くことができます:

SELECT DISTINCT @n := @n + 1 AS n, name FROM table1

しかし、このクエリでは、必要なものが得られません。table1のすべての行に増分変数を適用DISTINCTしてから、結果全体に適用します。すべての行が異なる値を持つことが保証されているためnDISTINCTは効果がありません。

他の回答ではDISTINCT、派生テーブル(サブクエリ)の内部で実行することを説明しています。これにより、の個別の値のみに基づいて行が強制的に削減さnameれ、結果の行に増分変数が適用されます。

于 2012-10-30T19:39:29.640 に答える
0

また、MS SQLにあるような関数がないことを調べたときにも同じ種類の問題が発生しましたRow Number()。その後、次のトリックを試してみましたが、うまくいきました。

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