2011-08-29 11 views
0

「dave」を検索する場合は、上位3行が表示されます。 'mike'と 'carl'の両方にdaveの親があります。したがって、表示される3行は上位3行になります。どのような種類のクエリでこれを達成できますか?

+----+----------+------------+ 
| id | parentid|  user | 
+----+----------+------------+ 
| 1 |  null |  dave | 
| 2 |  1 |  mike | 
| 3 |  1 |  carl | 
| 4 |  2 |  rick | 
| 5 |  4 |  mike | 

どのような種類のクエリがこれを実行しますか?ネストされたクエリ?

答えて

2

ん営巣

select 
    c.* 
from 
    YourTable c 
    left join YourTable p on p.id = c.parentid 
where 
    p.user = 'dave' /* for the 'children' */ or 
    c.user = 'dave' /* for Dave himself */ 

あなたはデイブ自身が返されたいが、子供たちだけでない場合は、where句から「c.user」を残すことができます。この場合、left joininner joinに変更することもできますが、それはこのクエリでは気づかないかもしれませんが、はるかに高速です。

+0

内部結合では、テーブル名を宣言します。この場合、 'c'と 'p'を使用しましたか?ありがとう、これは素晴らしいです。 – user892134

+0

テーブルにエイリアスを付けます。それはあなたの質問をより明確かつ短くします。そして、私がここでやったように、テーブルに参加することができます。エイリアシングと結合は別々のテクニックですが、しばしば一緒に使用されます。結合は、すべてのレコードをその親に結合するために実行されます。そうすれば、親の名前をフィルタリングしてすべての子を返すことができます。ネストされたクエリでこれを行うことはできますが、それは特にMySQL(ネストされたクエリは嫌です)では遅くなる可能性があります。 – GolezTrol

0
Select * from 
table_name as partA inner join table_name as partB on partA.id = partB.parentid 
Where partA.user = "Dave" or partB.user = "Dave" 
関連する問題