【问题标题】:SQL , count equivalent values in each columnSQL ,计算每列中的等效值
【发布时间】:2012-11-04 15:50:28
【问题描述】:

我正在开发一个使用 PHP 和 MYSQL 的 URL 缩短器项目,它跟踪每个 url 的访问。我提供了一个主要由以下属性组成的访问表:

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,我需要这些数据:

  • 此 URL 的每种操作系统的数量,例如 20 个 windows,15 个 linux,...
  • 每个所需时间段内的访问次数,例如过去 24 小时内每 10 分钟的访问次数
  • 每个国家的访问次数
  • ...

如您所见,某些数据(例如国家/地区)可能会接受许多不同的值。

我可以想象的一个好主意是进行查询,输出每列中每个唯一值的数量,例如在上面给出的数据的国家情况下,num_US 的列,num_UK 的列,一个用于num_IND

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

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

任何帮助将不胜感激。

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

【问题讨论】:

    标签: mysql sql visitor-statistic


    【解决方案1】:

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

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

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

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

    干杯。

    【讨论】:

    • 这种方式性能太差了。我确信它可以通过一个查询来完成。看看这个 stackoverflow.com/questions/915260/…>。但这里的区别在于每列可能值的数量。
    • 我添加了一个新条目,因为我在格式化 cmets 时遇到了问题。请阅读以上内容。
    【解决方案2】:

    您要绘制的每个图表都代表一个单独的关系,所以我的即兴回应是,您无法构建一个查询来准确地为您提供您想要绘制的每个图表所需的数据。

    从这一点来看,您的选择是:

    1. 对不同的图表使用不同的查询
    2. 向客户端发送一堆数据,让它进行所需的后处理,为不同的图表创建所需的确切数据集
    3. 将其全部交给 Google Analytics(@wahab-mirjan)

    如果您使用选项 2,您可以通过计算每(10 分钟、操作系统、浏览器、设备、url_id)元组的点击次数来最小化发送的数据量。这基本上删除了所有重复的行并给你一个计数。客户端软件将采用这些数字并按国家(或其他)进一步减少它们以获得图表所需的数字。不过老实说,我认为您是在为自己购买额外的复杂性而没有太多收获。

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

    【讨论】:

    • 为什么不同的查询?完成一次查询之后,可以解析结果以建立不同的关系。我认为这是一个更好的主意。看看这个:stackoverflow.com/questions/915260/…我想要这样的东西
    • 这就是选项 2 的作用。它将计算给定(url、国家、操作系统、设备等)元组的每个实例。我对这种技术的保留意见是:(1)为给定 URL 生成某人可能想要的所有图表的所有数据可能会耗费带宽和时间,并且(2)您会产生复杂性客户端需要对数据进行后处理。当然,我可能是错的。优化始终归结为深入了解您的数据和用例。
    【解决方案3】:

    抱歉,我是 Stack Overflow 的新手,遇到了评论格式问题。这是我的回答,希望它现在有效:

    不确定它的性能有多差。我的想法是你最终会得到一个如下所示的表格:

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

    因此,当您按国家/地区分组并计数时,这将是一个查询。我认为这会让你朝着正确的方向前进。无论如何,这只是一种意见,所以如果你发现另一种方法,我也有兴趣了解它。

    对上面的评论混乱表示歉意..

    干杯

    【讨论】:

      猜你喜欢
      • 2010-10-29
      • 1970-01-01
      • 2011-01-25
      • 1970-01-01
      • 2017-05-18
      • 2021-02-15
      • 1970-01-01
      • 2021-12-05
      • 2015-05-30
      相关资源
      最近更新 更多