1

更新 这是一个 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
4

4 回答 4

1

此查询使用一个子查询,它分别获取ID每个的最大值itunes_ID。如果子查询的结果与两列匹配,则子查询的结果将重新连接到原始表:itunes_IDID

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_IDID. 例如,

ALTER TABLE Apps ADD INDEX (itunes_ID, ID)
于 2013-02-25T16:51:10.357 回答
1

对于类似的方法,我使用“最近”布尔字段来标记包含最新版本的记录。这需要对每个插入进行 UPDATE 查询(停用以前的最近记录),但允许快速选择查询。或者,您可以维护两个表,一个包含最近的记录,另一个包含每个应用程序的历史记录。

编辑:也许你可以尝试类似这样的表:

  • id int not null auto_increment 主键
  • 版本 int 不为空
  • main_id int 空
  • 最近的布尔值不为空
  • 应用程序 varchar(32) 不为空
  • 评论 varchar(200) 空

您可以使用“main_id”列指向版本 1 的记录。

于 2013-02-25T16:53:43.753 回答
0

我只想要给定应用程序 (itunes_id) 的最新条目(最高 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在哪里。

确保iditunes_id复合索引中编制索引以获得最大效率。

于 2013-02-25T16:50:33.380 回答
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
于 2013-02-25T16:51:05.447 回答