9

結果に仮想行番号を自動的に追加するビューを作成する必要があります。ここでのグラフは完全にランダムです。私が達成したいのは、動的に作成される最後の列だけです。

> +--------+------------+-----+
> | id     | variety    | num |
> +--------+------------+-----+
> | 234    | fuji       |   1 |
> | 4356   | gala       |   2 |
> | 343245 | limbertwig |   3 |
> | 224    | bing       |   4 |
> | 4545   | chelan     |   5 |
> | 3455   | navel      |   6 |
> | 4534345| valencia   |   7 |
> | 3451   | bartlett   |   8 |
> | 3452   | bradford   |   9 |
> +--------+------------+-----+

クエリ:

SELECT id, 
       variety, 
       SOMEFUNCTIONTHATWOULDGENERATETHIS() AS num 
  FROM mytable
4

2 に答える 2

17

使用する:

SELECT t.id,
       t.variety,
       (SELECT COUNT(*) FROM TABLE WHERE id < t.id) +1 AS NUM
  FROM TABLE t

これは、返される行ごとに num 値のクエリが実行されるため、理想的な方法ではありません。より良いアイデアはNUMBERS、1 から始まり非常に大きな数に増加する数を含む単一の列を持つテーブルを作成しNUMBERS、次の変数の例と同様の方法でテーブルを結合して参照することです。

MySQLランキング、またはその欠如

MySQL にはランキング関数がないため、疑似行番号機能を取得するために変数を定義できます。

SELECT t.id,
       t.variety,
       @rownum := @rownum + 1 AS num
  FROM TABLE t,
       (SELECT @rownum := 0) r
  • SELECT @rownum := 0変数を定義し、ゼロに設定します。
  • rサブクエリのエイリアスを定義しないと、使用しなくても MySQL でエラーが発生するため、これはサブクエリ/テーブル エイリアスです。

MySQL ビューで変数を使用できない

これを行うと、1351 エラーが発生します。これは、設計により、ビューで変数を使用できないためですバグ/機能の動作は、ここに記載されています。

于 2009-12-27T01:15:34.843 に答える
4

OracleにはROWID疑似列があります。MySQLでは、醜くする必要があるかもしれません:

SELECT id,
       variety,
       1 + (SELECT COUNT(*) FROM tbl WHERE t.id < id) as num
  FROM tbl

このクエリは私の頭から離れており、テストされていないので、一粒の塩でそれを取ります。また、質問に示されている任意の番号付けではなく、何らかの並べ替え基準(この場合はid)に従って行に番号を付けることを前提としています。

于 2009-12-27T01:02:49.147 に答える