0
SELECT id, FIO, parent_id
FROM users
WHERE parent_id =
(
    SELECT id
    FROM users
    WHERE parent_id =
    (
        SELECT id
        FROM users
        WHERE id = 16
    )
)

そこで、ここでは階層ツリーを作成しています。最初にルートの親を選択し、次に子の親を選択して、24レベルの深さまで続けます。

問題は、内部クエリから複数の列を選択する方法です。

次のような情報を表示するには、他の行フィールドを取得する必要があるためです。name, surname, age

外側のクエリ(最上部)でこれらの行の列しか取得できないようです。

PS:重複フィールドを生成するため、結合は使用したくありません。

解決策はありますか?

4

5 に答える 5

4

MySQL クエリ変数を使用して、SQL 側で繰り返すことができます。これにより、1 つの親ノードのすべてのデータを含むすべての子が返されますが、自分自身を繰り返すことはありません (したがって、ツリーの深さに制限を課すことはありません)。

このようなもの: (500 は最初の親 ID です)

SELECT
  id,
  parent_id, 
  name, 
  '0' as depth, 
  @tree_ids := id AS foo
FROM 
   tree,
  (SELECT @tree_ids := '', @depth := -1) vars
WHERE id = 500
UNION
SELECT 
  id,
  parent_id,
  name,
  @depth := IF(parent_id = 500, 1, @depth + 1) AS depth,
  @tree_ids := CONCAT(id, ',', @tree_ids) AS foo
FROM 
  tree 
WHERE FIND_IN_SET(parent_id, @tree_ids) OR parent_id = 500

SQLfiddle で実際の例を参照してください

MySQL はインデックスを使用せず、代わりにフル テーブル スキャンを実行するため、大規模なデータセットではパフォーマンスが非常に低下することに注意してください。(インデックスを使用しない理由がわかりません。それがその理由です。誰かがインデックス作成の問題についてアドバイスや説明をしている場合は、コメントしてください!)

于 2012-07-09T21:33:54.090 に答える
2

=比較は単一の値に対してのみ機能します。in複数の値と比較するために使用できます。

SELECT ...
FROM yourtable
WHERE somefield IN (select somevalue from othertable);
于 2012-07-09T20:25:42.800 に答える
0

階層データを mysql に保存して取り出すのは、それほど単純ではありません。

これを調べてください: https://stackoverflow.com/a/4346009/9094

操作するには、より多くのデータが必要になります。

于 2012-07-09T20:25:24.433 に答える
0

あなたの言いたいことを正確に理解しているかどうかは100%わかりませんが、サブセレクトでテーブルからすべての列を個別に選択したい場合...

col1, col2, col3, col4

列ごとに、同じ WHERE に対して常に一致する単一の副選択が必要になります。例:

`SELECT * FROM main_table,
(SELECT col1 FROM inner_table WHERE inner_table.some_column=main_table.some_column),
(SELECT col2 FROM inner_table WHERE inner_table.some_column=main_table.some_column), ...`
于 2012-07-09T20:29:16.587 に答える
0

あなたのDB関係はMPTTになるように設定されているようです.mysql MPTTデータをクエリする方法を説明した良いブログ投稿があります http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

完全なツリーの例を見てください 要約すると、結合を使用して実行できます。

于 2012-07-09T20:27:16.183 に答える