【问题标题】:Generating an html table of pages visited by users ordered by user and then by the last page visited from MySQL table生成用户访问的页面的 html 表,按用户排序,然后按从 MySQL 表访问的最后一页
【发布时间】:2012-08-19 14:01:02
【问题描述】:

我有一个 MySQL 表,用于记录登录用户对网站上每个页面的访问。它有一列用于用户,一列用于访问页面的名称,另一列用于访问时间/日期。

我想使用 MySQL 查询生成一个表,以以下格式汇总该表中的信息,即我希望该表主要按用户上次访问的日期进行排序,然后每个都有一行他们访问过的页面(每个访问过的页面一行(我用三页来说明,但我真的希望列出所有页面),即使他们多次访问过该页面),按上次访问的时间/日期排序到此页面,并有一列表示用户对该页面的总访问次数:

我已经尝试使用 GROUP by 和 DISTINCT 进行各种查询,但我还没有很接近,所以很高兴能得到一些帮助来完成这项工作。

【问题讨论】:

  • 您只想要用户访问过的top 3 页面吗?
  • @JohnWoo 不,我只用了 3 页来说明。我想要用户列出的所有访问过的页面,以及他们访问每个页面的次数(我会将此信息添加到问题中)。

标签: mysql group-by distinct


【解决方案1】:

试试这个。您可能需要对此进行调整,因为我无法完全复制您的场景

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

【讨论】:

  • 谢谢。看起来您正在将查询设置为仅返回前三页?是这样吗?如果是这样,我想我只是删除Where p.rank &lt;=3 以返回所有页面。正确的?另外,我不确定如何构建 html 表来处理您的查询。显然,它不像使用 while($row=mysql_fetch_array($result)){ 然后回显行那样直接。你能帮忙吗?
  • 你试过了吗。它应该为每个用户返回前 3 个
  • 是的,我试过了,用我表中列的实际名称替换它,它返回了表中的所有行,即近 5000 行,并且没有特定的顺序
  • 谢谢。我很难理解小提琴上生成的表格。我在 UserID 下看到一个日期,但没有看到按用户分组的任何页面。
  • 这就是为什么我说你需要调整查询。我已经更新了小提琴,希望有效。但你仍然需要微调
【解决方案2】:

可能有更好的方法,但我最终使用两个查询解决了这个问题。第一个为每个名称返回一个唯一的行:

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

然后我使用 count_page 为每个单元格设置一个行跨度,其中的名称为:

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

然后,在每个名称的循环中,我运行了第二个查询,该查询为每个名称的每个唯一页面返回一行:

"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'] 返回我想要的其他信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    相关资源
    最近更新 更多