sql >> データベース >  >> RDS >> Mysql

サブグループで、生成された増分列をSQLクエリに追加するにはどうすればよいですか?

    ここで最も優れたブログ投稿の助けを借りて、私はそれを解決しました: http://www.xaprb.com/blog/2006/12/15/advanced-mysql-user-variable-techniques/

    解決策は簡単ではなく、変数とmysqlがクエリ操作を順序付ける方法に関する高度な知識が必要ですが、かなりパフォーマンスが高いようです。重要な点の1つは、変数の割り当てを関数呼び出し内に隠すことができることです!

    基本的に、次のクエリで問題が解決します。

    SET @num := 0, @type := '';
    
    SELECT name, subgroup, @num AS increment
    FROM table_name
    WHERE 0 <= GREATEST(
       @num := IF(@type = subgroup, @num + 1, 1),
       LEAST(0, LENGTH(@type := subgroup)))
    

    関数GREATESTLEAST 、およびLENGTH 変数割り当てのコンテナとして存在します。ご覧のとおり、これらの関数は基本的にクエリの出力に影響を与えることはありません。

    ただし、テーブルに連続していない「サブグループ」値があることもわかりました。例:

    +------+----------+
    | name | subgroup |
    +------+----------+
    | john | 1        |
    | doe  | 1        |
    | jim  | 1        |
    | greg | 2        |
    | boe  | 2        |
    | amos | 3        |
    | ben  | 1        |
    | gary | 2        |
    +------+----------+
    

    次のような出力テーブルが作成されました:

    +------+----------+-----------+
    | name | subgroup | increment |
    +------+----------+-----------+
    | john | 1        |         1 |
    | doe  | 1        |         2 |
    | jim  | 1        |         3 |
    | greg | 2        |         1 |
    | boe  | 2        |         2 |
    | amos | 3        |         1 |
    | ben  | 1        |         1 |
    | gary | 2        |         1 |
    +------+----------+-----------+
    

    ORDER BYへの取り組み 実行順序が原因で、クエリの最後にある句が機能せず、ORDER BYで変数の割り当てが非表示になりました 条項は近づきましたが、独自の問題があったため、使用した最後のクエリは次のとおりです。

    SET @num := 0, @type := '';
    
    SELECT name, subgroup, @num AS increment
    FROM (SELECT * FROM table_name ORDER BY subgroup) AS table_name2
    WHERE 0 <= GREATEST(
       @num := IF(@type = subgroup, @num + 1, 1),
       LEAST(0, LENGTH(@type := subgroup)))
    

    結果として次の出力が得られます:

    +------+----------+-----------+
    | name | subgroup | increment |
    +------+----------+-----------+
    | john | 1        |         1 |
    | doe  | 1        |         2 |
    | jim  | 1        |         3 |
    | ben  | 1        |         4 |
    | greg | 2        |         1 |
    | boe  | 2        |         2 |
    | gary | 2        |         3 |
    | amos | 3        |         1 |
    +------+----------+-----------+
    

    イェーイ!



    1. MySQLINSERTSELECT-重複する行

    2. テーブルに最後に挿入された10行を取得します

    3. Railsが範囲付きのwhere句のハッシュ構文を使用してクエリに`OR1 =0`を追加しているのはなぜですか?

    4. SQLデータベースにアラビア文字を挿入する方法は?