更新这是一个sqlfiddle http://sqlfiddle.com/#!2/e0822/1/0
我有一个应用程序的MySQL数据库(itunes_id),每个应用程序ID都有一个注释字段。要保留历史记录,每次更改注释时,都会添加一行新数据。在下面的查询中,我只想要一个每个应用程序(itunes_id)的最新条目(最高ID)的列表。
以下是我的数据库的标题:
id (key and auto increment)
itunes_id
comments
date
此查询获取给定itunes_id的最新条目。如何使此查询更有效?
SELECT * FROM (
SELECT * FROM (
SELECT * FROM Apps
ORDER BY id DESC
) AS apps1
GROUP BY itunes_id
) AS apps2
LIMIT 0 , 25
答案 0 :(得分:1)
此查询使用子查询,该子查询分别为每个ID
获取最大itunes_ID
。然后,子查询的结果将在原始表上重新连接,前提是它匹配两列:itunes_ID
和ID
。
SELECT a.*
FROM Apps a
INNER JOIN
(
SELECT itunes_id, MAX(ID) max_id
FROM Apps
GROUP BY itunes_id
) b ON a.itunes_id = b.itunes_id AND
a.ID = b.max_ID
LIMIT 0, 25
要获得更快的效果,请在列INDEX
和itunes_ID
上创建复合列ID
。 EG,
ALTER TABLE Apps ADD INDEX (itunes_ID, ID)
答案 1 :(得分:1)
对于类似的方法,我使用“recent”布尔字段来标记包含最新版本的记录。这需要对每个插入进行UPDATE查询(停用上一个最近的记录),但允许快速选择查询。或者,您可以维护两个表,一个表包含最近的记录,另一个表包含每个应用程序的历史记录。
编辑:也许您可以尝试与此类似的表:
您可以使用“main_id”列指向版本为1的记录。
答案 2 :(得分:0)
我只想要给定应用的最新条目(最高ID)(itunes_id)
这样做
SELECT MAX(id), comments FROM Apps WHERE itunes_id = "iid";
或
SELECT id, comments FROM Apps WHERE itunes_id = "iid" ORDER BY id DESC LIMIT 1;
iid
是您想要最新评论的itunes ID。
确保将id
和itunes_id
编入索引composite index以获得最高效率。
答案 3 :(得分:0)
SELECT * FROM (
SELECT * FROM (
SELECT * FROM Apps
ORDER BY id DESC
) AS apps1
GROUP BY itunes_id
) AS apps2
LIMIT 0 , 25
不会选择最旧的记录(您不能假设生成的密钥始终是“最旧的”)。你想要的是这样的:
SELECT * FROM (
SELECT * FROM (
SELECT * FROM Apps
where some_date = (select max(some_date) from Apps limit 1)
ORDER BY id DESC
) AS apps1
GROUP BY itunes_id
) AS apps2
LIMIT 0 , 25