2012-03-01 22 views
2

私は、再帰的関係を持つgroupテーブルを持っているので、各レコードはparent_idです。グループを考えると、すべてのサブグループの名前はすべてstudent(各グループに属します)にする必要がありますが、学生名順に並べる必要があります。SQLiteの順序付けされた値を持つ再帰的なクエリ

「簡単な」方法があるかどうか知っていますか?複数のクエリを実行する必要がある場合、異なるカーソルの結果を順序付ける必要がありますが、CursorにはorderBy()はありません。

アイデア?どうもありがとうございます!

答えて

2

SQLiteのは、私は2つのステップで選択を実装再帰クエリをサポートしていませんので:

まず、私はこの方法を再帰的に親IDは、パラメータで渡す1であるすべてのグループIDをretreives getRecursiveDiningGroupIdsAsString()と呼ばれる持っています。結果は、 "(2,3,4)"という形式の文字列であり、後でIN節で使用できます。この方法は、次のようになります。

public String getRecursiveDiningGroupIdsAsString(int depth, long diningGroupId) { 
    Cursor childDiningGroups = mDatabase.query(
      "group", 
      new String[] {"_id"}, 
      "parent_id = "+diningGroupId, 
      null, null, null, null 
    ); 
    String recursiveDiningGroupIds = ""; 
    while (childDiningGroups.moveToNext()) { 
     long childDiningGroupId = childDiningGroups.getLong(childDiningGroups.getColumnIndex("_id")); 
     recursiveDiningGroupIds += getRecursiveDiningGroupIdsAsString(depth+1, childDiningGroupId); 
    } 
    recursiveDiningGroupIds += diningGroupId; 
    if (depth > 0) { 
     recursiveDiningGroupIds += ", "; 
    } else { 
     recursiveDiningGroupIds = "("+recursiveDiningGroupIds+")"; 
    } 
    return recursiveDiningGroupIds; 
} 

私は私が必要とするグループIDを持っていたら、私は、以前のメソッドによって返されたIDを使用して簡単なクエリを実行し、それはそれであります!

希望すると助かります!

+0

再帰的なクエリの意味を誤解しているかもしれませんが、再帰的な「選択」をサポートしていないSQLiteについては間違っていると思います。私は 'SQLiteDatabase.rawQuery()'を通して 'SELECT * FROM(SELECT column FROM table)'と似たものを試してみました。これが攻撃的であるか厳しいのであれば申し訳ありませんが、自分自身をノウ・イット・オールのように聞こえるようにする方法は考えられません。 – cesar

+0

私は実際にあなたがそれによって何を意味しているかを調べようとしています。 Androidに再帰的なクエリを許可するメソッドがなく、未処理のSQLコードを使用する必要があることを意味しましたか?それとも別のことを意味しましたか?もう一度、私が知っている人として去っていくのは本当にすみませますが、これを言い換える方法は考えられません。 :P – cesar

+1

Sqliteは再帰クエリをサポートしていません。 cesarを表示するサンプルクエリは再帰的ではなく、単に完全にサポートされている別のクエリに埋め込まれたクエリにすぎません。再帰的なクエリはそれ自身を呼び出すでしょう。 Googleの "Sql CTE"の例 –

関連する問題