mysql - 显示表 1 中最后更新的条目的数据,以及来自表 2 的信息

标签 mysql

我有两个表:

rankHistory,它存储 bookID 与其给定关键字的排名。 其结构如下:

create table rankHistory (
id int(10),
rankUpdated timestamp,
bookId varchar(10),
keyword varchar(100),
rank int(5)
);

此表中包含的示例数据:

INSERT INTO rankHistory
(`id`, `rankUpdated`,`bookId`,`keyword`,`rank`)
VALUES
(1, '2016-05-27 05:11:44', 'BK-001','romantic','80'),
(2, '2016-05-28 08:11:44', 'BK-001','romantic','15'),
(3, '2016-05-28 09:11:44', 'BK-001','romantic','13'),
(4, '2016-05-27 07:11:44', 'BK-001','romantic book','77'),
(5, '2016-05-28 08:11:44', 'BK-001','romantic book','25'),
(6, '2016-05-28 09:11:44', 'BK-001','romantic book','22'),
(7, '2016-05-27 05:11:44', 'BK-002','horror','65'),
(8, '2016-05-28 08:11:44', 'BK-002','horror','10'),
(9, '2016-05-29 07:11:44', 'BK-002','horror book','25'),
(10, '2016-05-29 08:11:44', 'BK-002','horror book','9')
;

bookConfig 包含带有给定关键字的 bookID 信息。 其结构如下:

create table bookConfig (
id int(10),
category varchar(40),
author varchar(255),
info varchar (255)
);

此表中包含的示例数据:

INSERT INTO bookConfig
(`id`,`bookId`,`keyword`, `category`, `author`,`info`)
VALUES
(1, 'BK-001', 'romantic', 'Romance', 'Author1','Romance themed book written by author1'),
(2, 'BK-001', 'romantic book', 'Romance', 'Author1','Romance themed book written by author1'),
(3, 'BK-002', 'horror ', 'Horror', 'Author2','Horror themed book written by author2'),
(4, 'BK-002', 'horror book', 'Horror', 'Author2','Horror book written by author2')
 ;

我已将其合并到 http://sqlfiddle.com/#!9/9502a9 中.

rankHistory 表包含数万条与提供的数据相似的记录,我也很关心速度。结构可能从一开始就是错误的,但不幸的是,这是我必须处理的遗留问题。

我想实现的是:

为每个唯一的 bookid/keyword 组合选择具有最新时间戳的条目,然后加入 bookConfig 中包含的与该组合相关的信息。

所以期望的输出是:

rankUpdated          bookId  keyword      rank,category,author,  info
---------------------------------------------------------------------------- 
2016-05-28 09:11:44, BK-001, romantic,      13, romance, Author1, Romance themed book..
2016-05-28 09:11:44, BK-001, romantic book, 22, romance, Author1, Romance themed book..
2016-05-28 08:11:44, BK-002, horror,        10, horror,  Author2, Horror themed book..
2016-05-29 08:11:44, BK-002, horror book,    9, horror,  Author2, Horror book ...

我已经尝试了多种方法来实现这一点,但都没有成功,并且不知道如何正确地实现这一点。如果有人更精通 mySQL 可以指出实现此目标的最佳方法,我将不胜感激。

非常感谢您分享您的专业知识

最佳答案

一个选择是进行一系列连接以实现您想要的:

SELECT COALESCE(t2.rankUpdated, 'NA'), AS rankUpdated, t1.bookId, t1.keyword,
    COALESCE(t2.rank, 'NA') AS rank, t1.category, t1.author, t1.info
FROM bookConfig t1
LEFT JOIN
(
    SELECT r1.bookId, r1.rankUpdated, r1.rank, r1.keyword
    FROM rankHistory r1
    INNER JOIN
    (
        SELECT bookId, keyword, MAX(rankUpdated) AS rankUpdated
        FROM rankHistory
        GROUP BY bookId, keyword
    ) r2
        ON r1.bookId = r2.bookId AND r1.keyword = r2.keyword AND
           r1.rankUpdated = r2.rankUpdated
) t2
    ON t1.bookId = t2.bookId AND t1.keyword = t2.keyword

点击下面的链接获取正在运行的演示:

SQLFiddle

关于mysql - 显示表 1 中最后更新的条目的数据,以及来自表 2 的信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37537213/

相关文章:

PHP插入错误

MySQL - SQL代码优化

mysql - bash 脚本中的 SQL 查询问题

MySQL排序数问题

Mysql搜索匹配和排序

php - 无法避免mysql查询中的重复结果

mysql - 使用 WHERE 将表连接到自身

mysql - 为什么我无法获取查询结果

mysql - Aruba-MySQL : can't create/change table to engine=INNODB

php - Joomla 已移动,现在 index.php 将我重定向到根文件夹