0

私は以下のDBを持っていますが、SQLコマンドを実行しようとすると、実行すべきことを完全に実行できません(以下のコードはcursorSize、1である必要がありますが、0を示しています)。

私が実行するコードは次のとおりです。

SQLiteDatabase db = this.getReadableDatabase();

String countQuery = "SELECT  songid FROM TABLE_TRACKS WHERE (tagid = 7 OR tagid = 10) AND tagid = 9";
Cursor cursor = db.rawQuery(countQuery, null);
int cursorSize = cursor.getCount();

括弧を変更して作成すると、where句と関係があります。

WHERE (tagid=9 AND tagid = 7) OR tagid=10

それint cursorSizeは2であるために機能します。SQLWHERE句またはAND/OR演算子について、私が見逃している何か、または私が知らない何かがありますか?

誰かが私のためにこれを説明してくれて、私が望む結果を得る方法を教えてくれたら本当にありがたいです。songid(以下では、に等しい1行を返し3ます。)

ここに画像の説明を入力してください

4

4 に答える 4

2

結果に問題はありません。次の理由により、ゼロになるはずです。

  • tagid = 7 と 9 の行が同時に存在することはありません。
  • tagid = 10 と 9 の行が同時に存在することはありません。

アプリのロジックと、ここで何を達成しようとしているのかを確認する必要があります。

編集:

So think of songIDs as songs and tagIDs as Tags (guitar, piano, romantic and so on) so if I want to find the songs which has (piano AND guitar) OR romantic tag how is it possible ? do I have to change my db (table) or can I reformulate my sql ?

これがアプリのコンテキストであり、ユーザーからの入力の組み合わせが予想される場合は、db スキームを変更することをお勧めします。各タグにブール列を追加してみてください。このような組み合わせが予想される場合は、これがより簡単になり、スペースの点でそれほど違いはありません。

于 2012-08-11T22:38:43.540 に答える
1

期待どおりに動作しています。

最初に実行するtagid = 7 OR tagid = 10

だから結果は

7  2
7  3
10 4

それでAND tagid = 9

tagid 9上記の結果をチェックするようになりました

何もありません。したがって、カーソルのサイズはZERO

于 2012-08-11T22:39:06.033 に答える
1

CursorSize が 0 である理由は、クエリに論理エラーが含まれているためです。あなたのクエリは言う: (tagid = 7 OR tagid = 10) AND tagid = 9.

このクエリは、AND 演算子で結合された 2 つの異なる条件ステートメントと考えてください。つまり、yourtagidが 7 ANDのtagid = 9場合、yourcursorSizeは更新されます。tagid7 と 9 の両方になるにはどうすればよいでしょうか。songidfromtagid 7とを使用する場合は、7 または 9 を使用する必要があると思いますtagid 9

(tagid=9 AND tagid = 7) OR tagid=10ゼロ以外を返す理由cursorSizeは、少なくともtagid == 10データベース エントリを取得する場合に、上で提案したように OR 演算子を使用しているためです。

于 2012-08-11T22:39:06.393 に答える
1

このブール文:

(tagid = 7 OR tagid = 10) AND tagid = 9

tagid同時に 7 (または 10) と 9 の両方でなければならないことを意味します。それはうまくいきません。

このブール文の理由:

(tagid=9 AND tagid = 7) OR tagid=10

の値が 10 の行が 2 つあるためtagidです。

于 2012-08-11T22:39:28.100 に答える