【问题标题】:How to retrieve 10 latest DISTINCT IP's from a MySQL table?如何从 MySQL 表中检索 10 个最新的 DISTINCT IP?
【发布时间】:2010-11-01 03:06:27
【问题描述】:

我有一个包含 pagehit(标准化)数据的表,我需要获取 10 个最新的唯一 ip。

我试着这样做:

SELECT * FROM spy_hits ORDER BY date desc GROUP BY ip LIMIT 10;

这应该给我这个结果:

+-----+------------+-----+---------+----+------+-- ----+---------+--------+--------+ |编号 |日期 |知识产权 |浏览器 |操作系统 |页 |主持人 |推荐人 |查询 |代理| +-----+------------+-----+---------+----+------+-- ----+---------+--------+--------+ |第354章1244442065 | 2 | 3 | 2 | 16 | 1 | 47 | 12 | 2 | | 311 | 1244442000 | 1 | 2 | 1 | 16 | 1 | 36 | 12 | 1 | +-----+------------+-----+---------+----+------+-- ----+---------+--------+--------+ 2 行(0.00 秒)

这是该网站的最新唯一身份访问者。

但是我得到一个语法错误而不是那个结果。

所以我必须做这个查询:

SELECT * FROM spy_hits GROUP BY ip ORDER BY date desc LIMIT 10;

我认为没问题。但它给出了这样的结果:

+-----+------------+-----+---------+----+------+-- ----+---------+--------+--------+ |编号 |日期 |知识产权 |浏览器 |操作系统 |页 |主持人 |推荐人 |查询 |代理| +-----+------------+-----+---------+----+------+-- ----+---------+--------+--------+ | 280 | 1242130841 | 2 | 3 | 2 | 16 | 1 | 47 | 12 | 2 | | 268 | 1242130818 | 1 | 2 | 1 | 16 | 1 | 36 | 12 | 1 | +-----+------------+-----+---------+----+------+-- ----+---------+--------+--------+ 2 行(0.00 秒)

但这会在分组后按日期设置顺序,因此它会抓取表中的第一个唯一 ip,它们也是最旧的。

表格如下:

id --- 日期 268 1242130818(旧) | | 五五 354 1244442065(新)

但我希望它在分组之前是这样的:

id --- 日期 354 1244442065(新) ^ ^ | | 268 1242130818(旧)

我正在使用 PHP,所以如果有人知道如何使用 PHP 解决方案获得结果。

提前干杯:)

【问题讨论】:

  • +1 来自一个相对较新的用户的可靠问题。如果 StackOverflow 中的所有问题都是这样,世界会变得更美好。
  • +1 出于与上述评论相同的原因。继续努力吧! :)

标签: sql mysql group-by sql-order-by


【解决方案1】:

如果您的DISTINCT IP 很少:

SELECT  ip, MAX(date) AS maxdate
FROM    (
        SELECT  ip, MAX(date) AS maxdate
        FROM    spy_hits
        GROUP BY
                ip
        )
ORDER BY
        maxdate DESC
LIMIT 10

如果你有很多 DISTINCT IP 的:

SELECT  *
FROM    spy_hits so
WHERE   NOT EXISTS
        (
        SELECT  1
        FROM    spy_hits si
        WHERE   si.ip = so.ip
                AND si.date > so.date
        )
ORDER BY
        date DESC
LIMIT 10

在这个表上创建两个索引:

CREATE INDEX ix_spyhits_date ON spy_hits (date)
CREATE INDEX ix_spyhits_ip_date ON spy_hits (ip, date)

将大大改善这些查询。

有关性能详情,请参阅我的博客中的此条目:

【讨论】:

    猜你喜欢
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 2011-11-25
    • 1970-01-01
    • 2021-12-05
    相关资源
    最近更新 更多