2

次の列のサイト訪問の表があります。

timestamp
host
url

最後の数回(たとえば200回)の訪問を確認したいのですが、同時に同じホストのグループ訪問を一緒に見たいと思います(彼/彼女が訪問したページのシーケンスを確認するため)。

私が行った場合:

... SORT BY timestamp DESC, host

複数の訪問者が同時にオンラインになっていると、ホストが混乱します

私が行った場合:

... SORT BY host, timestamp DESC

最新の訪問を取得していません(各ホストからの最新の訪問のみ)

私は見たいです例えば

9:01 | a.com | /index
9:05 | a.com | /interesting
9:07 | a.com | /contact
9:02 | b.com | /index
9:03 | b.com | /product-a
9:08 | b.com | /thanks-for-buying

それはMysqlで可能ですか、それともphpで結果をさらに処理する必要がありますか?

4

5 に答える 5

1

これを試して::

Select *, MAX(timestamp_col) as lastVisit from site_table

GROUP BY HOSTS order by lastVisit desc
于 2012-11-15T09:25:31.503 に答える
1

ORDER BY続いてLIMIT別のを行うことはできないORDER BYため、サブクエリを使用する必要があります。

SELECT * FROM (SELECT * 
    FROM visits
    ORDER BY timestamp DESC
    LIMIT 200
) visits2
ORDER BY host
于 2012-11-15T09:31:08.320 に答える
0

最後の200が必要な場合は、結果を制限する必要があります

  SORT BY timestamp DESC, host LIMIT 0, 200 

また、同じ訪問者が再び表示されない場合は、

SELECT DISTINCT visitor FROM ....
于 2012-11-15T09:26:39.667 に答える
0

1つのクエリで正常にすることはできないと思います。あなたはこれを試すことができます:

SELECT * 
FROM table AS t1 
WHERE t1.timestamp_col >= (SELECT MIN(tstamp) 
    FROM (SELECT t2.timestamp_col 
        FROM tables AS t2 
        WHERE t2.host = t1.host 
        ORDER BY timestamp_col DESC 
        LIMIT 200
    )
)

私はこのクレイジーなコードをテストしません...しかし、それがあなたに道を譲ることを願っています:)

于 2012-11-15T09:31:24.320 に答える
0

上記の答えは私を正しい方向に向けてくれました、ありがとう。これは動作します。LIMIT 1000は、クエリをほぼ3分から7秒(40000レコード)に短縮することです。

SELECT v1.stamp, v1.host FROM visits AS v1 
   LEFT JOIN (SELECT MIN(date) AS firstVisit, host
              FROM visitor AS v2 
              GROUP BY v2.host
              ORDER BY firstVisit DESC
              LIMIT 1000) AS j
       ON v1.host=j.host 
       ORDER BY firstVisit DESC, v1.host, v1.date DESC
       LIMIT 100;
于 2012-11-15T22:30:54.147 に答える