4

我有一个包含 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 解决方案获得结果。

提前干杯:)

4

1 回答 1

3

如果你有几个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's:

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)

将大大改善这些查询。

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

于 2009-06-08T09:11:11.117 回答