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

リンクリストのmysqlクエリ

    クエリは、t_listを反復処理することで機能します テーブル(最後の行)。このテーブルの各行について、SELECTのサブクエリ 句はテーブルを再クエリし、現在の行の子を検索します(WHERE parent = _parent -しかし_parent @rのエイリアスです )。各反復で、子のid @rに割り当てられます 変数。

    境界を追加するには、このバリエーションでうまくいくはずです:

    SELECT * FROM (
        SELECT
            @r AS _parent,
            @r := (
                SELECT id
                FROM t_list
                WHERE
                    ( @c = 0 AND _parent IS NULL AND parent IS NULL ) -- special case if the first item is the root
                    OR (parent = _parent)
            ) AS id,
            @c := @c + 1 AS rank
        FROM (
            SELECT @c := 0, @r := parent FROM t_list WHERE id = @start
        ) AS ini,
        (
            SELECT id FROM t_list LIMIT @limit
        ) AS lim
    ) AS tmp WHERE id IS NOT NULL;
    

    @startを置き換えます および@limit idを使用 それぞれ、最初のアイテムの最大数と取得するアイテムの最大数です。 ここでテストしてください

    このようなデータ構造をRDBMSでモデル化することは、おそらく完全に悪い考えです。 「インデックス」列を使用しないのはなぜですか?リストを取得するとすぐになります:

    SELECT * FROM list ORDER BY index_column ASC;
    

    リストは頻繁に変更されることを意図しているかもしれませんが、リストが非常に大きくならない限り、このようなクエリはかなり高速であるはずです:

    -- insert an element at position X 
    UPDATE list SET index_column = index_column +1 WHERE index_column > X ORDER BY index_column DESC;
    INSERT INTO list VALUE (some_value, X);
    
    -- delete an element at position X 
    DELETE FROM list WHERE index_column = X;
    UPDATE list SET index_column = index_column -1 WHERE index_column > X ORDER BY index_column ASC;
    



    1. Mysql警告コード1592ステートメント形式を使用してバイナリログに書き込まれた安全でないステートメント

    2. データベース接続は常に開いたままにする必要がありますか、それとも必要な場合にのみ開く必要がありますか?

    3. SQL ServerのIDから列の名前を取得します:COL_NAME()

    4. 複数のSQLステートメントを使用するMySQLConnectorJ