0

ログインしたユーザーが Web サイトの各ページにアクセスしたことを記録する MySQL テーブルがあります。ユーザー用の列、訪問したページの名前用の列、訪問した日時用の列があります。

MySQL クエリを使用してテーブルを生成し、このテーブルからの情報を以下の形式で要約したいと考えています。つまり、主にユーザーが最後にアクセスした日付でテーブルを並べ替え、次に各ページの行を並べ替えたいと考えています。訪問済み (訪問したページごとに 1 行 (説明するために 3 ページを使用しましたが、実際にはすべてのページをリストしたいと思います)、ページを複数回訪問した場合でも)、このページを最後に訪問した日時で並べ替えます、およびユーザーがページに行った合計訪問数の列:

ここに画像の説明を入力

GROUP by と DISTINCT を使用してさまざまなクエリを試しましたが、あまり近づいていません。これを機能させるための助けがあれば幸いです。

4

2 に答える 2

0

もっと良い方法があるかもしれませんが、最終的には 2 つのクエリを使用してこれを解決しました。最初の行は、名前ごとに一意の行を返します。

SELECT *,COUNT(DISTINCT Page) AS count_page FROM visits GROUP by Name ORDER BY MAX(Date) DESC";

次に、count_page を使用して、Name を含む各セルの行スパンを設定しました。

echo "<tr><td ROWSPAN=\"".$row['count_page']."\">";

次に、各名前のループ内で、名前ごとに一意のページごとに行を返す 2 番目のクエリを実行しました。

"SELECT Page, unix_timestamp(NOW()) - unix_timestamp(MAX(Date)) as time_page, COUNT(Page) as Count FROM visits WHERE Name='".$row['Name']."' GROUP by Page ORDER BY MAX(Date) DESC"

$row['Page']その後、$row['time_page']とを使用$row['Count']して、必要な追加情報を返すことができました。

于 2012-08-19T20:57:43.303 に答える
0

これを試して。シナリオを完全に再現できなかったため、これを微調整する必要があるかもしれません

Select * from
(
select 

    page, 
    visitdate
    userid,
    @rank:=case when @tmpuserid<>userid then 1
    else
      IFNULL(@rank,0)+1 
    end as rank,
    @tmpuserid:=userid as tmpuserid

from pages
order by visitdate
) p
Where  p.rank <=3
于 2012-08-19T14:40:25.400 に答える