4

ページヒット (正規化) データを含むテーブルがあり、最新の 10 個の一意の IP を取得する必要があります。

私はこのようにそれをやろうとしました:

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

この結果が得られるはずです:

+-----+------------+-----+---------+----+------+-- --+---------+-------+-------+
| | ID | 日付 | ip | ブラウザ | os | ページ | ホスト | リファラー | クエリ | エージェント |
+-----+------------+-----+---------+----+------+-- --+---------+-------+-------+
| | 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;

大丈夫だと思ったもの。しかし、次の結果が得られます。

+-----+------------+-----+---------+----+------+-- --+---------+-------+-------+
| | ID | 日付 | ip | ブラウザ | os | ページ | ホスト | リファラー | クエリ | エージェント |
+-----+------------+-----+---------+----+------+-- --+---------+-------+-------+
| | 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 (旧)
  | | | |
  VV
 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:

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

このテーブルに 2 つのインデックスを作成します。

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 に答える