2016-05-09 15 views
-1

Iテーブルを持っているが、のMySQL - に関する複数の行

SLNO| ID |CHILD ID 
    1 | 1 | 200 
    2 | 1 | 250 
    3 | 250 | 350 
    4 | 7 | 8 

我々は、単一の行の、1の全ての値を抽出するクエリ、すなわち1、200、250、350を持つことができますか? SLNOはユニークです。

答えて

0

まず、複数の行を1つの行にまとめるには、どうすればよいですか?

最も便利なショートカットは、GROUP BY操作とGROUP_CONCAT機能を使用することです。

MySQLにはネイティブ(組み込み)階層クエリ機能はありません。

あなたは、このようなパターンで、レベルの有限数に、それをエミュレートすることができます:

SELECT GROUP_CONCAT(DISTINCT t.`CHILD_ID` ORDER BY t.`CHILD ID`) AS child_id_list 
    FROM ( 
      SELECT a1.`CHILD ID` 
      FROM mytable a1 
      WHERE a1.`ID` = 1 

      UNION ALL 

      SELECT b2.`CHILD ID` 
      FROM mytable b1 
      JOIN mytable b2 ON b2.`ID` = b1.`CHILD ID` 
      WHERE b1.`ID = 1 

      UNION ALL 

      SELECT c3.`CHILD ID` 
      FROM mytable c1 
      JOIN mytable c2 ON c2.`ID` = c1.`CHILD ID` 
      JOIN mytable c3 ON c3.`ID` = c2.`CHILD ID` 
      WHERE c1.`ID` = 1 

     ) t 

このパターンは、レベルの有限数に拡張することができます。

  UNION ALL 

      SELECT d4.`CHILD ID` 
      FROM mytable d1 
      JOIN mytable d2 ON d2.`ID` = d1.`CHILD ID` 
      JOIN mytable d3 ON d3.`ID` = d2.`CHILD ID` 
      JOIN mytable d4 ON d4.`ID` = d4.`CHILD ID` 
      WHERE c1.`ID` = 1 

GROUP_CONCAT機能は、1つの列を返します。返される文字列の長さは、変数group_concat_max_len(およびまたmax_allowed_packet)に制限されています。文字列の長さがgroup_concat_max_lenを超える場合、文字列の値は、エラーまたは警告なしで、返されるときに許容される最大長(バイト単位)にサイレントにトリミングされます。

ネイティブの組み込み関数を使用する単一のMySQLクエリでは、任意のレベルのレベルで真の再帰を取得することはできません。 MySQLのストアドプロシージャを使用して、必要なループを実装することができます。

+0

これは、私が持っているデータセットが2 lakh IDのあまりにも大きいので、より効率的になります –

+0

a1.'ID' = 1 –

関連する問題