2016-12-23 3 views
2

2つのテーブルがあります。私はすべての行を選択する必要があるWHERE節のidが前の行のものである場合のSELECTデータ

select fo_id from t2 
      where fo_id=44 and @id:=fo_prev_id 
    union select fo_id from t2 where [email protected] 
    union ...; 

が、行の数は、非永続的である: - 最初は、最後の操作のIDを保持し、第2の動作のIDと

ここ
mysql> select * from t1; 
+----+--------------+ 
| id | id_last_oper | 
+----+--------------+ 
| 1 |   45 | 
+----+--------------+ 

mysql> select * from t2; 
+-------+------------+---------+ 
| fo_id | fo_prev_id | fo_name | 
+-------+------------+---------+ 
|  1 |  NULL | a  | 
|  5 |   1 | a  | 
| 22 |   5 | a  | 
| 45 |   22 | a  | 
+-------+------------+---------+ 

いくつかのデータは、私のクエリです単純なUNIONの行はすべて選択できません。目標を達成するにはどうすればいいですか?

+0

結果は? –

+0

チェーンのようなすべての行 – vit

+0

@juergend彼は再帰的階層クエリを望んでいます。 –

答えて

2

私は数ヶ月前に同じ問題がありました。 解決策は2つあります。

策1(推奨) - 「/左右関係」
リレーショナルデータベースとの作業は、階層構造のために設計されていません。このリンクは、階層構造を使用するためにテーブルの構造を変更するのに役立ちました。それ用のイスト高速かつ簡単に: http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/
それはあなたが使用するデータベースとは無関係であり、私の経験は一貫して正である

ソリューション2ので、私は、あなたがこのソリューションを使用することをお勧めします - これでストアドプロシージャ
ストアドプロシージャ自体を再帰的に呼び出すことができます。この声明では、それは良い説明です。あなたはもっと下にスクロールする場合それはあなたが探して何であれば、その1
mysql stored procedure that calls itself recursively

+0

のレコメンデーションを確認してください。 – vit

0

私は本当にわからない溶液中で同じリンクを参照してください。

SELECT result.* 
FROM (
    SELECT 
     (select fo_id FROM t2 where fo_id = @xid) as ids 
     , @xid := (select `fo_prev_id` FROM t2 where fo_id = @xid) as next_id 
     , @row := @row +1 as row_order 
    FROM t2 AS dummy 
    CROSS JOIN (SELECT @xid := 45, @row := 0) as init 
) AS orderd_ids 
LEFT JOIN t2 AS result ON result.`fo_id` = orderd_ids.ids 
ORDER BY orderd_ids.row_order; 

サンプル

mysql> SELECT * FROM t2;                                             +-------+------------+---------+ 
| fo_id | fo_prev_id | fo_name | 
+-------+------------+---------+ 
|  1 |  NULL | a  | 
|  5 |   1 | a  | 
| 22 |   5 | a  | 
| 45 |   22 | a  | 
+-------+------------+---------+ 
4 rows in set (0,00 sec) 

mysql> SELECT result.* 
    -> FROM (
    ->  SELECT 
    ->   (select fo_id FROM t2 where fo_id = @xid) as ids 
    ->   , @xid := (select `fo_prev_id` FROM t2 where fo_id = @xid) as next_id 
    ->   , @row := @row +1 as row_order 
    ->  FROM t2 AS dummy 
    ->  CROSS JOIN (SELECT @xid := 45, @row := 0) as init 
    ->) AS orderd_ids 
    -> LEFT JOIN t2 AS result ON result.`fo_id` = orderd_ids.ids 
    -> ORDER BY orderd_ids.row_order; 
+-------+------------+---------+ 
| fo_id | fo_prev_id | fo_name | 
+-------+------------+---------+ 
| 45 |   22 | a  | 
| 22 |   5 | a  | 
|  5 |   1 | a  | 
|  1 |  NULL | a  | 
+-------+------------+---------+ 
4 rows in set (0,00 sec) 

mysql> 

サンプル2

mysql> SELECT * FROM t2; 
+-------+------------+---------+ 
| fo_id | fo_prev_id | fo_name | 
+-------+------------+---------+ 
|  1 |   66 | a  | 
|  5 |   1 | a  | 
| 22 |   5 | a  | 
| 45 |   22 | a  | 
| 66 |   72 | a  | 
| 72 |  NULL | a  | 
+-------+------------+---------+ 
6 rows in set (0,00 sec) 

mysql> SELECT result.* 
    -> FROM (
    ->  SELECT 
    ->   (select fo_id FROM t2 where fo_id = @xid) as ids 
    ->   , @xid := (select `fo_prev_id` FROM t2 where fo_id = @xid) as next_id 
    ->   , @row := @row +1 as row_order 
    ->  FROM t2 AS dummy 
    ->  CROSS JOIN (SELECT @xid := 45, @row := 0) as init 
    ->) AS orderd_ids 
    -> LEFT JOIN t2 AS result ON result.`fo_id` = orderd_ids.ids 
    -> ORDER BY orderd_ids.row_order; 
+-------+------------+---------+ 
| fo_id | fo_prev_id | fo_name | 
+-------+------------+---------+ 
| 45 |   22 | a  | 
| 22 |   5 | a  | 
|  5 |   1 | a  | 
|  1 |   66 | a  | 
| 66 |   72 | a  | 
| 72 |  NULL | a  | 
+-------+------------+---------+ 
6 rows in set (0,00 sec) 

mysql> 
関連する問題