mysql - 从另一个获取最后的独特值(value)和附加信息

标签 mysql

我有两张 table ;

  • 网页 - 包含多个网站的网址和名称的表格
  • 访问 - 包含访问时间、客户端 IP 以及访问网站的 URL 的表格

我需要掌握对任何给定网页的最后 X(假设 10)次访问,这是 ip 和 url 的独特组合。因此,如果用户多次连接到一个页面,则只能将其列为一行(假设是最新的一行)。

我有一个查询可以得到我需要的结果,但它非常慢。为了获得最后 10 次唯一访问,大约需要 45 秒。

这是查询;

select ma.access_date, mp.name 
from access ma, webpages mp
where ma.url = mp.url 
and ma.id = (select max(id) 
             from access ma2 
             where ma2.client_id = ma.client_id 
             and ma2.url = ma.url)
order by ma.id desc 
limit 10;

我该如何优化这个?我的查询是否存在缺陷,或者我完全走错了路?

最佳答案

通过移动(相关的)子查询,您可以显着减少要读取的数据:

SELECT
    a.access_date,
    w.name
FROM
    (SELECT
        client_id,
        url,
        MAX(id) id
    FROM
        access
    GROUP BY
        client_id, url
    ORDER BY id DESC
    LIMIT 10
    ) s
JOIN
    access a
    USING (client_id, url, id)
JOIN
    webpages w
    USING (url)

关于mysql - 从另一个获取最后的独特值(value)和附加信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26056088/

相关文章:

Mysql 正则表达式匹配 <year>、<year_0>、<year_1> 标签中的相同子字符串

mysql - Csv 到 Mysql INSERT INTO 最后一行

mysql - 如何选择时间点记录

PHP PDO DB 连接未知字符集

c# - 如何使用ubuntu服务器获取mysql的连接字符串?

c++ - EXE 编译后停止工作。 (Mysql C++ 连接器)

php - 在mysql中搜索多个表

php - 从天数中获取范围

mysql - 将深度匹配表变成扁平表的最佳方法

mysql - 多对多关系查询行吗?