我有下面的数据库,当我尝试运行一个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。
有什么傻事我错过了或者我不了解SQL WHERE子句或AND / OR运算符吗?
如果有人能为我解释这个和如何获得我想要的结果,真的很感激。 (下面我想返回一行songid
等于3
。)
答案 0 :(得分:2)
结果没有错。它应该给你零,因为:
您需要检查您的应用逻辑以及您要在此处完成的任务。
修改强>
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 ?
如果这是您的应用程序的上下文,并且您希望用户使用某些输入组合,我建议您更改数据库方案。尝试为每个标记添加布尔列。如果您期望这样的组合,这将更容易,并且在空间方面不会有太大差异。
答案 1 :(得分:1)
它按预期工作。
首先执行tagid = 7 OR tagid = 10
结果将是
7 2
7 3
10 4
然后AND tagid = 9
现在检查上述结果中的tagid 9
没有任何可用的东西。因此,光标大小为ZERO
答案 2 :(得分:1)
CursorSize为0的原因是您的查询包含逻辑错误。
您的查询显示:(tagid = 7 OR tagid = 10) AND tagid = 9
。
将此查询视为由AND运算符连接的两个不同条件语句,这意味着如果您的tagid
为7并且tagid = 9
,那么您的cursorSize
会更新。你的tagid
如何同时成为7和9?我想如果你想使用songid
和tagid 7
中的tagid 9
,你需要做的就是使用7 OR 9。
(tagid=9 AND tagid = 7) OR tagid=10
为您提供非零cursorSize
的原因是因为现在您正在使用上面建议的OR运算符,所以至少在tagid == 10
得到{{1}}的情况下返回数据库条目。
答案 3 :(得分:1)
这个布尔语句:
(tagid = 7 OR tagid = 10) AND tagid = 9
意味着tagid
必须同时为7(或10)AND 9。那不行。
这个布尔语句的原因:
(tagid=9 AND tagid = 7) OR tagid=10
有效是因为在tagid
中有两行值为10。