0

我正在尝试创建一些具有以下特征的表:

  • 存储特定键的所有数据版本
  • 能够轻松获取所有密钥的最新版本数据

我的架构如下:

CREATE TABLE WebSitesStatus(
  -- Host name of the site in question.
  Host String(40) NOT NULL,
  -- When the information on the site was last updated.
  UpdateDate Date NOT NULL,

  HttpsWorks BOOL NOT NULL,
  ModernTls BOOL NOT NULL,

) PRIMARY KEY(Host, UpdateDate DESC);

因此,该表的一个示例子集可能是:

+--------------+------------+------------+-----------+
| Host         | UpdateDate | HttpsWorks | ModernTls |
+--------------+------------+------------+-----------+
| foobar.com   | 2016-10-14 | true       | false     |
| google.com   | 2016-10-14 | true       | true      |
| google.com   | 2016-04-23 | false      | false     |
| nytimes.com  | 2016-10-14 | false      | false     |
| nytimes.com  | 2016-05-25 | true       | true      |
| nytimes.com  | 2016-04-25 | true       | false     |
| nytimes.com  | 2016-04-23 | true       | false     |
| paypal.com   | 2016-10-14 | true       | false     | 
+--------------+------------+------------+-----------+

我想找到回去的方法

+--------------+------------+------------+-----------+
| Host         | UpdateDate | HttpsWorks | ModernTls |
+--------------+------------+------------+-----------+
| foobar.com   | 2016-10-14 | true       | false     |
| google.com   | 2016-10-14 | true       | true      |
| nytimes.com  | 2016-10-14 | false      | false     |
| paypal.com   | 2016-10-14 | true       | false     |
+--------------+------------+------------+-----------+

但结构不允许我轻松做到这一点。有没有办法轻松地进行此查询?

4

1 回答 1

0

这个查询:

SELECT t.Host, MAX(t.UpdateDate) AS UpdateDate
FROM WebSitesStatus AS t
GROUP BY t.Host

只返回你想要的行的主键:

+--------------+------------+
| Host         | UpdateDate |
+--------------+------------+
| foobar.com   | 2016-10-14 |
| google.com   | 2016-10-14 |
| nytimes.com  | 2016-10-14 |
| paypal.com   | 2016-10-14 |
+--------------+------------+

要获取其他列,您必须JOIN将其返回到同一个表,如下所示:

SELECT p.Host, p.UpdateDate, q.HttpsWorks, q.ModernTls,
FROM (SELECT t.Host, MAX(t.UpdateDate) AS UpdateDate
      FROM WebSitesStatus AS t 
      GROUP BY t.Host) AS p
JOIN WebSitesStatus AS q
ON p.Host = q.Host AND p.UpdateDate = q.UpdateDate;

这会产生这些数据,这就是您想要的:

+--------------+------------+------------+-----------+
| Host         | UpdateDate | HttpsWorks | ModernTls 
+--------------+------------+------------+-----------+
| amazon.co.uk | 2016-10-14 | true       | false     |
| amazon.com   | 2016-10-14 | true       | true      |
| nytimes.com  | 2016-10-14 | false      | false     |
| paypal.com   | 2016-10-14 | true       | false     |
+--------------+------------+------------+-----------+

这有点低效,因为它会扫描您的表两次:一次获取主键值,然后再次获取所有其他值。但这可能是最干净的方法。

于 2017-02-17T02:55:55.637 回答