8

通常のテーブルの自動インクリメントと同様に、行番号が挿入されるrow_numという名前の列を持つビューを作成する必要があります。

この通常のテーブルがあるとしましょう:

| country | name | age | price |
--------------------------------
| US      | john | 22  | 20    |
| France  | Anne | 10  | 15    |
| Sweden  | Alex | 49  | 10    |

等々...

作成したいビューは次のとおりです。

    | country | name | price | row_num |
    ------------------------------------
    | US      | john |  20   |    1    |
    | France  | Anne |  10   |    2    |
    | Sweden  | Alex |  5    |    3    |

等々...

単一の選択でrow_numを生成できます:

SELECT @i:=@i+1 AS row_num, testing.country, testing.name, testing.price
FROM testing testing,(SELECT @i:=0) derivedTable
order by name

しかし、私の問題は、上記のクエリをビューを作成するクエリと組み合わせることです。これは私が試している複合クエリです:

CREATE OR REPLACE view vwx (country, name, price, num_row) AS SELECT mytable.country, mytable.name, mytable.price, @i:=@i+1 AS row_number
    FROM testing testing,(SELECT @i:=0) derivedTable
    order by name;

次のエラーが表示されます: #1351 - ビューの SELECT に変数またはパラメーターが含まれています

ビューで選択内で選択を使用できないことはわかっていますが、このビューを希望どおりに実行する他の方法はわかりませんが、これを行う方法があると確信していますが、わかりませんどうやって。おそらく関数またはプロシージャを使用しますが、私はそれらに本当に慣れていないため、mysql で関数またはプロシージャを作成することに慣れていません。

それ以外の場合は、さらに詳細に説明させていただきます。

4

8 に答える 8

7

これに対する解決策を見つけました:

最初に関数を作成します。

delimiter //

CREATE FUNCTION `func_inc_var_session`() RETURNS int
    NO SQL
    NOT DETERMINISTIC
     begin
      SET @var := @var + 1;
      return @var;
     end
     //

delimiter ;

次に、 @var を開始したい番号に設定します。この場合ゼロ。

@var=0; を設定します。

次に、次のようにビューを作成します。

CREATE OR REPLACE VIEW myview (place, name, hour, price, counter) 
AS SELECT place, name, hour, price, func_inc_var_session() 
FROM yourtable
WHERE input_conditions_here;

ここでの秘訣は、カウンター列に NULL が表示される場合があることです。これが発生した場合は、@var を再度自分の番号に設定してから、SELECT * を再度実行すると、カウンター列が適切に入力されていることがわかります。

于 2013-05-02T18:06:40.093 に答える
0

このクエリをビューに適用してみてください -

CREATE TABLE testing (
  id int(11) NOT NULL DEFAULT 0,
  country varchar(255) DEFAULT NULL,
  name varchar(255) DEFAULT NULL,
  age int(11) DEFAULT NULL,
  price int(11) DEFAULT NULL,
  PRIMARY KEY (id)
);

INSERT INTO testing(id, country, name, age, price) VALUES
  (1, 'US', 'john', 22, 20),
  (2, 'France', 'Anne', 10, 15),
  (3, 'Sweden', 'Alex', 49, 10),
  (4, 'France', 'Anne', 11, 16);

SELECT
  t1.*, COUNT(*) row_num
FROM testing t1
  LEFT JOIN testing t2
    ON t2.name < t1.name OR (t2.name = t1.name AND t2.id <= t1.id)
 GROUP  BY t1.name, t1.id;

+----+---------+------+------+-------+---------+
| id | country | name | age  | price | row_num |
+----+---------+------+------+-------+---------+
|  3 | Sweden  | Alex |   49 |    10 |       1 |
|  2 | France  | Anne |   10 |    15 |       2 |
|  4 | France  | Anne |   11 |    16 |       3 |
|  1 | US      | john |   22 |    20 |       4 |
+----+---------+------+------+-------+---------+
  • このクエリはユーザー変数を使用しないため、ビューで機能します。
  • ON 句に条件を追加すると、フィールドに重複した値を実装するのに役立ちますname
于 2013-04-10T12:35:08.803 に答える
-1
CREATE OR REPLACE view vwx (country, name, price, num_row) AS
SELECT country, name, price, @index := @index + 1 AS num_row
FROM testing, (SELECT @index := 0) temp
于 2013-04-10T08:12:11.853 に答える