我在我的Android应用程序中保存了一个数据库,并希望检索插入数据库的最后10条消息.
我用的时候:
Select * from tblmessage DESC limit 10;
Run Code Online (Sandbox Code Playgroud)
它给了我10条消息,但来自TOP.但我想要最后 10条消息.可能吗?
假设整个表数据是 -
1,2,3,4,5....30
Run Code Online (Sandbox Code Playgroud)
我写了查询 select * from tblmessage where timestamp desc limit 10
表明 30,29,28...21
但我希望序列为 - 21,22,23...30
我正在尝试让我的ContentResolver运行此查询:
select * from myTable limit 1 offset 2
Run Code Online (Sandbox Code Playgroud)
ContentResolver中唯一的查询方法是:
resolver.query(uri, projection, selection, selectionArgs, sortOrder);
Run Code Online (Sandbox Code Playgroud)
我试过了:
final Cursor c = resolver.query(
MyTable.CONTENT_URI,
MyTable.PROJECTION,
" ? ?",
new String[] {"1", "2"},
null);
Run Code Online (Sandbox Code Playgroud)
这只是抛出一个IllegaLArgumentException.实现这一目标的正确方法是什么?
关于SQLite3的快速问题(也可能是一般的SQLite)
如何检索查询结果的第n行?
row_id(或任何索引)对我的情况不起作用,因为表包含带数字的列.根据一些数据,查询需要未排序的数据或按asc/desc标准排序.
但我可能需要快速检索结果的第2行和第5行.
所以除了现在用计数器实现sqlite3_step()== SQLITE_ROW之外,我不知道如何继续这个.
由于性能问题,我不太喜欢这个解决方案.所以,如果有人可以提出一个值得高度赞赏的提示.
关心大卫
我正在使用以下代码获取通知列表(总行数为21):
List<Notification> list = new ArrayList<Notification>();
Cursor c = _db.query(TABLE_NAME, COL_ALL, null, null, null, null, order, get_limitStr(offset));
if(c != null && c.moveToFirst())
{
while(!c.isAfterLast())
{
Notification model = cursorToModel(c);
if(model != null)
{
list.add(model);
}
c.moveToNext();
}
c.close();
}
Run Code Online (Sandbox Code Playgroud)
并且生成的offset = 0的查询是
SELECT Id, Token, Title, Read, Message, Image, CreateDate, CreateDateFA FROM Notifications ORDER BY CreateDate DESC LIMIT 20,0
Run Code Online (Sandbox Code Playgroud)
并且它按预期工作并返回20行,当我将偏移量增加1(偏移= 1)时,它只返回1行,这是正确的,但问题是当偏移量大于1时,查询将是
SELECT Id, Token, Title, Read, Message, Image, CreateDate, CreateDateFA FROM Notifications ORDER BY CreateDate DESC LIMIT 20,2 …
Run Code Online (Sandbox Code Playgroud) 我有一个这样的Sqlite数据库表(没有升序)
但是我需要按名称以升序顺序检索表,当我按升序设置它时,rowId按照混乱的顺序改变如下
但我每次都需要按升序检索一些有限数量的联系人5
像Aaa - Eeee和Ffff-Jjjjj ......
但是要限制像0-5 5-10 ....**它可以使用rowid,因为它们是混乱的顺序
所以我需要另一个列,如(oracle中的rowNum),按顺序为1234567 ...每次都如下
如何使用现有列检索该列
Note: WE DONTE HAVE ROWNUM LIKE COLUMN IN SQLITE
我有一个书籍表、一个作者表和一个“链接器”表(作者/书籍之间的多对多链接)。
如何找到书籍数量最多的作者?
这是我的架构:
书籍:rowid,名称
作者:rowid、姓名
book_authors:rowid、book_id、author_id
这就是我想出的:(但它不起作用)
SELECT count(*) IN book_authors
WHERE (SELECT count(*) IN book_authors
WHERE author_id = author_id)
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想要一份前 100 位作者的报告,例如:
author_name book_count
-----------------------------------
Johnny 25
Kelly 12
Ramboz 10
Run Code Online (Sandbox Code Playgroud)
我需要某种形式的加入吗?最快的方法是什么?
有没有办法使用线程同时执行 SQL 查询,这样我就可以减少下面代码的处理时间?有没有更好的方法可以在不使用 pandas 模块的情况下执行与下面相同的结果?鉴于我正在使用的数据集的大小,我无法将整个数据集存储在内存中,我发现循环遍历 SELECT * FROM 语句的行并将它们与我正在查询的列表进行比较会增加处理时间。
# DATABASE layout
# _____________________________________________________________
# | id | name | description |
# |_____________|____________________|__________________________|
# | 1 | John | Credit Analyst |
# | 2 | Jane | Doctor |
# | ... | ... | ... |
# | 5000000 | Mohammed | Dentist |
# |_____________|____________________|__________________________|
import sqlite3
SEARCH_IDS = [x for x in range(15000)]
DATABASE_NAME = 'db.db'
def chunks(wholeList, chunkSize=999):
"""Yield successive n-sized chunks from wholeList.""" …
Run Code Online (Sandbox Code Playgroud) 我正在编写自己的 SQLIteBrowser,并且有最后一个问题,这显然在网络上经常讨论,但似乎没有一个好的通用解决方案。
所以目前我存储用户输入的SQL。每当我需要获取行时,我都会通过在 SQL 末尾添加“Limit n, m”来执行 SQL。
对于我主要使用的普通 SQL,这似乎已经足够了。但是,如果我想在查询中使用 limit 自己,这显然会给出错误,因为生成的 sql 可能如下所示:
select * from table limit 30 limit 1,100
Run Code Online (Sandbox Code Playgroud)
这显然是错误的。有更好的方法来做到这一点吗?
我的想法是,我可以扫描 SQL 并检查是否已经使用了限制子句,然后忽略它。当然它不是那么简单,因为如果我有这样的sql:
select * from a where a.b = ( select x from z limit 1)
Run Code Online (Sandbox Code Playgroud)
显然在这种情况下它仍然应该应用我的限制,所以我可以从末尾扫描字符串并查看是否存在限制。我现在的问题是,这有多可行。由于我不知道 SQL 解析器是谁工作的,所以我不确定 LIMIT 是否必须位于 SQL 的末尾,或者末尾是否还可以有其他命令。
我用order by
and测试了它,如果不是最后,group by
我会得到 SQL 错误,所以我的假设似乎是正确的。limit