4

これが私のテーブル構造です...

TABLE : position_hierarchy_level

id parent_position_id position_id
 1 1                  2
 2 2                  3
 3 3                  4
 4 4                  5
 5 5                  6
 6 6                  7
 7 7                  8
 8 8                  9
 9 9                  10
 10 10                11
 11 11                12
 12 12                13
 13 13                14
 14 14                15

parent_position_id特定のものを取得するための私のクエリposition_idは次のとおりです。

select `parent_position_id` from `position_hierarchy_level` where position_id= 15;

しかし、どうすれば特定の最上位の親を取得できposition_idますか? たとえば、15 の最上位parent_position_idposition_idになります1

単一のクエリを使用してこの値を取得する便利な方法はありますか? または、PHP でループを作成する必要がありますか?

4

6 に答える 6

4

15以上の結合がない限り、データベース構造ではそれを実行できません。隣接リストモデルを使用しています。入れ子集合モデルを使用してみてください

これがphpの例です

于 2012-04-17T07:59:01.493 に答える
2

これを試して:

DELIMITER $$

CREATE FUNCTION getTopParentPositionId(positionId INT) RETURNS INT DETERMINISTIC 
BEGIN
    DECLARE x INT;
    DECLARE y INT;
    SET x = positionId;
    sloop:LOOP
        SET y = NULL;
        SELECT parent_position_id INTO y FROM position_hierarchy_level WHERE position_id = x;
        IF y IS NULL THEN
            LEAVE sloop;
        END IF;  
        SET x = y;
        ITERATE sloop;
    END LOOP;
    RETURN x;
END $$

DELIMITER ;

それで:

SELECT getTopParentPositionId( 5 );

明らかに、これらの種類の解決策を検討したのはあなただけではありません:)

于 2012-04-17T08:00:07.857 に答える
1

このテーブル構造を使用する場合の最良のオプションは、phpの終わりのループです。

テーブル構造が自由に変更できるものである場合(プロジェクトがまだ稼働していない場合)、と呼ばれる構造を調べることをお勧めしますClosure Tablesこの記事で、の使用方法/設定の簡単な例を見つけることができます。

いずれにせよ、 SQLアンチパターンの本でこのテーマについてもっと多くのことを見つけることができるはずです。

于 2012-04-17T08:03:57.137 に答える
1

私が正しく理解していて、最高のposition_idをparent_position_idなどに1にしたい場合...

1. parent_position_id を自動インクリメントに設定

2. テーブル order から position_id des で position_id を選択し、それらを配列に入れます

3. テーブルを切り捨てる

4 . 配列をテーブルに挿入する

于 2012-04-17T07:52:24.473 に答える
1

同じ問題のように見えます: 隣接リスト表示のための再帰的な PHP 関数

mysql で単一のクエリを使用するのは、ちょっと違うかもしれません。たぶん、ストアドプロシージャでこれを解決できます。

于 2012-04-17T07:41:25.087 に答える
1

単一のクエリを使用して取得する便利な方法はありますか?

いいえ、MySQL の階層クエリについてはこちらをご覧ください

PHP でループ ステートメントを作成する必要がありますか?

私はイエスと思う。

于 2012-04-17T07:58:10.213 に答える