从SQLite中选择类似的最后一条记录

时间:2014-01-29 10:38:32

标签: android sql sqlite

我在DB中有一个表,其中包含以下列:

  • ACTION_TYPE
  • 的file_id
  • 时间

现在,我需要选择具有特定类型和时间的所有操作,并使用file_id删除文件。问题是我可能从该查询中获得了几行,但我只需要一个,最后添加到DB中。

假设DB中的示例记录:

_id = 1, action_type = 1, file_id= 1, time = 1000
_id = 2, action_type = 1, file_id= 1, time = 2000
_id = 3, action_type = 1, file_id= 1, time = 3000
_id = 4, action_type = 1, file_id= 2, time = 1000
_id = 5, action_type = 1, file_id= 2, time = 2000
_id = 6, action_type = 1, file_id= 2, time = 3000

现在,我只需要_id = 3和_id = 6的记录。我该如何构建这样的查询?

注意:我正在使用SQLite。

3 个答案:

答案 0 :(得分:2)

好的,您可以获取所有不同file_id的最新记录。通常,此请求应在sqlite中正常工作:

SELECT file_id, 
       _id, 
       action_type, 
       Max(time) 
FROM   test 
GROUP  BY file_id; 

编辑:

好的,您的请求更复杂:

SELECT `_id`, `action_type`, `file_id`, `time` FROM testtable t1
GROUP BY file_id
HAVING time = (
    SELECT MAX(time) FROM testtable t2 
    WHERE t2.file_id = t1.file_id
) 

http://sqlfiddle.com/#!5/9f936/2

答案 1 :(得分:1)

您可以使用子查询来获得此结果:

SELECT _id, file_id
FROM table t
WHERE action_type = x 
    AND t.time = (SELECT Max(time) 
                     FROM Table s
                     WHERE s.action_type = t.action_type
                       AND s.file_id = t.file_id)

有关如何使用子查询,请参阅以下链接: http://www.tutorialspoint.com/sqlite/sqlite_sub_queries.htm

答案 2 :(得分:1)

如果您的表格每个文件不包含两次相同的时间戳,则可以使用

SELECT * FROM yourtable WHERE time = (SELECT max(time) FROM yourtable)

无需按file_id分组或打扰它,因为每个文件的时间戳不能超过1个。

_ID     ACTION_TYPE     FILE_ID     TIME
------------------------------------------------
  3               1           1     3000
  6               1           2     3000

请参阅http://sqlfiddle.com/#!2/9f9364/5/0