2016-04-09 15 views
2

親子関係船と出会うすべての行を取得しようとしています。例えば 今私は、私はここに1209年には1205年に、1205は1200に関連する関係のように1209の親子関係の船を満たすすべての行を取得するために1209 IDたくてきた、と1200は1000親子関係船のすべてのデータをmysqlの同じテーブルから取得する

に関連

id   Title parent_id 
    1200  A  1000 
    1201  B  1000 
    1202  C  1000 
    1203  D  1000 
    1204  E  1200 
    1205  F  1200 
    1206  G  1201 
    1207  H  1205 
    1208  I  1205 
    1209  J  1205 

私はこのクエリ

SELECT * FROM `category` a left join category b on a.id=b.parent_id where a.id=1209 

を試みたが、これは私に1つのレコードのみを与えています。この関係にあるすべての行を取得しようとしています。

+0

MySQLは、階層的な関係/再帰クエリのために少しサポートしています。これは面白いかもしれません:http://stackoverflow.com/questions/4048151/what-are-the-options-for-storing-hierarchical-data-in-a-relational-database。 –

+0

ありがとうございます。面白い話題。しかし、これを簡単に読むのにはあまり時間をかけてはいけません。私は後でこれを読むでしょう。 –

+0

select * from category of child join category。parent.parent_id = child.id このクエリは私にすべてのデータを与えますが、id = 1209を渡すときには、再びその行を1行与えます。 –

答えて

5

親、祖父母、greatgrandの親を探しているのなら、このようなものを使うことができます。

SELECT id,title,parent_id FROM 
    (SELECT id,title,parent_id, 
     CASE WHEN id = 1209 THEN @id := parent_id 
      WHEN id = @id THEN @id := parent_id 
      END as checkId 
    FROM Test 
    ORDER BY id DESC) as T 
WHERE checkId IS NOT NULL 

sqlfiddle

そして、念のため、あなたはこの

SELECT id,title,parent_id FROM 
    (SELECT id,title,parent_id, 
      CASE WHEN id = 1200 THEN @idlist := CONCAT(id) 
       WHEN FIND_IN_SET(parent_id,@idlist) THEN @idlist := CONCAT(@idlist,',',id) 
      END as checkId 
    FROM Test 
    ORDER BY id ASC) as T 
WHERE checkId IS NOT NULL 

sqlfiddle for finding children

を使用することができ、すべての子供たち、そして孫やIDの偉大な孫を検索する場合複数の子供のすべての両親/祖父母/大祖父母を見つけるための質問

SELECT id,title,parent_id FROM 
(SELECT id,title,parent_id, 
     CASE WHEN id in (1209,1206) THEN @idlist := CONCAT(IFNULL(@idlist,''),',',parent_id) 
      WHEN FIND_IN_SET(id,@idlist) THEN @idlist := CONCAT(@idlist,',',parent_id) 
      END as checkId 
FROM Test 
ORDER BY id DESC)T 
WHERE checkId IS NOT NULL 

sqlfiddle

+0

これをn番目のレベルで使用できますか? –

+0

あなたの子供のIDが常に親のIDより大きい限り、試してみてください。 –

+0

はい。私はいつも親のIDよりも大きいと思う。 その作業。ありがとう。私はこれで6時間を過ごしましたが失敗しました。 –