Iテーブルを持っているが、のMySQL - に関する複数の行
SLNO| ID |CHILD ID
1 | 1 | 200
2 | 1 | 250
3 | 250 | 350
4 | 7 | 8
我々は、単一の行の、1の全ての値を抽出するクエリ、すなわち1、200、250、350を持つことができますか? SLNOはユニークです。
Iテーブルを持っているが、のMySQL - に関する複数の行
SLNO| ID |CHILD ID
1 | 1 | 200
2 | 1 | 250
3 | 250 | 350
4 | 7 | 8
我々は、単一の行の、1の全ての値を抽出するクエリ、すなわち1、200、250、350を持つことができますか? SLNOはユニークです。
まず、複数の行を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のストアドプロシージャを使用して、必要なループを実装することができます。
これは、私が持っているデータセットが2 lakh IDのあまりにも大きいので、より効率的になります –
a1.'ID' = 1 –