0

我有下面的数据库,当我尝试运行 SQL 命令时,它并没有完全完成它应该做的事情(下面的代码应该有cursorSize1,但它显示为 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。我是否遗漏了一些愚蠢的东西,或者我对 SQL WHERE 子句或 AND/OR 运算符不了解的东西?

如果有人可以为我解释这一点以及如何获得我想要的结果,我将不胜感激。(下面我想返回一行songid等于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 ?

如果这是您的应用程序的上下文,并且您希望用户提供一些输入组合,我建议您更改您的数据库方案。尝试为每个标签添加布尔列。如果您期望这样的组合,这将更容易,并且在空间方面不会有太大差异。

于 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 运算符连接的两个不同的条件语句,这意味着如果您tagid是 7 AND,tagid = 9那么您的将cursorSize被更新。你怎么能tagid同时是 7 和 9?我认为如果你想使用songidfromtagid 7和 ,你需要做的是使用 7 OR 9 tagid 9

(tagid=9 AND tagid = 7) OR tagid=10给你一个非零的原因cursorSize是因为现在你正在使用我上面建议的 OR 运算符,所以至少在tagid == 10你取回数据库条目的情况下。

于 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 in tagid

于 2012-08-11T22:39:28.100 回答