SQL,计算每列中的等效值

时间:2012-11-04 15:50:28

标签: mysql sql visitor-statistic

我正在使用PHP& amp; MYSQL跟踪每个网址的访问量。我提供了一个访问表,主要包括这些属性:

time_in_second | country | referrer |  os   | browser | device | url_id
#####################################################################
1348128639     |    US   |   direct |  win  | chrome  | mobile | 3404  
1348128654     |    US   |   google | linux | chrome  | desktop| 3404  
1348124567     |    UK   |   twitter| mac   | mozila  | desktop| 3404  
1348127653     |    IND  |   direct | win   | IE      | desktop| 3465  

现在我想对这个表进行查询。例如,我想获取url_id=3404的网址访问数据。因为我应该提供统计数据并绘制图表,对于这个网址,我需要这些数据:

  • 此URL的各种操作系统的编号,例如20个窗口,15个linux,...
  • 每个所需时间段内的访问次数,例如过去24小时内每10分钟
  • 每个国家/地区的访问次数
  • ...

如您所见,像国家这样的某些数据可能会接受许多不同的值。

我能想象的一个好主意是进行查询,输出每列中每个唯一值的数量,例如,在上面给出的数据的国家案例中,num_US的列,{{1}的列1}},以及num_UK的一个。

现在的问题是如何在sql(MYSQL)中实现这样的高性能查询?

另外,如果您认为这不是一个有效的性能查询,那么您的建议是什么?

任何帮助都将深深感激。

更新:查看此问题:SQL; Only count the values specified in each column。我认为这个问题与我的问题类似,但不同之处在于每个列可能存在各种值(因为num_IND可能存在大量值),这使得查询更加复杂。

3 个答案:

答案 0 :(得分:0)

看起来您需要执行多个查询。您可能可以使用不同的参数编写一个查询,但这会使其复杂且难以维护。我会将它作为多个小查询来处理。因此,对于每个要求,我都会进行查询并单独或单独调用它们。例如,如果您想要提到的国家/地区查询,则可以执行以下操作

SELECT country, count (*) FROM <TABLE_NAME> WHERE url_id = 3404 GROUP BY Country

顺便说一句,我还没有测试过这个查询,所以它可能不准确,但这只是为了给你一个想法。我希望这会有所帮助。

此外,另一个建议是使用谷歌分析,看看它,它们确实有很多你已经实施的东西,也许这也有帮助。

干杯。

答案 1 :(得分:0)

您要绘制的每个图形都代表一个单独的关系,因此我的袖口响应是您无法构建单个查询,该查询为您提供您想要绘制的每个图形所需的数据。

从这一点来说,你的选择是:

  1. 对不同的图表使用不同的查询
  2. 将一堆数据发送到客户端,让它进行必要的后处理,以创建不同图形所需的确切数据集
  3. 将所有内容全部转移到Google Analytics(la laway-mirjan)
  4. 如果你使用选项2,你可以通过计算每(10分钟,操作系统,浏览器,设备,url_id)tupple的命中数来最小化你发送的数据量。这基本上删除了所有重复的行,并为您提供计数。客户端软件将获取这些数字并进一步按国家(或其他)减少它们以获得图形所需的数字。说实话,我认为你为自己买了额外的复杂性而不是很多。

    如果您坚持自己这样做(而不是使用服务),那么对每种图形使用不同的查询。从几个合理的索引开始(url_id和time_in_second是明显的起点)。使用explain语句(或数据库提供的任何语句)来了解每个查询的执行方式。

答案 2 :(得分:0)

抱歉,我是Stack Overflow的新手,并且注释格式有问题。这是我的答案,希望它现在有效:

不确定性能如何差。我想的方式是你最终得到一个如下表:

country | count 
################# 
     US | 304 
     UK | 123 
     UK | 23 

因此,当您按国家/地区分组并计数时,它将是一个查询。我想这会让你朝着正确的方向前进。在任何情况下,这只是一个意见,所以如果你找到另一个approch,我也有兴趣了解它。

对那里的评论搞砸道歉......

干杯