mySQL选择访问并按月显示所有内容?

时间:2009-07-08 17:42:19

标签: php mysql syntax

我现在正在为mySQL查询和语法而努力。我可以帮助实现以下目标: -

我有一个指标/分析表,其中包含访问国家/地区。我有以下查询: -

SELECT `country`, COUNT(`ip`) AS `cViews` FROM `metrics` WHERE `projID` = 'projID' AND `country` != 'XX' AND `when` BETWEEN '$dateFrom' AND '$dateTo' GROUP by country

请注意; when是时间戳字段。

从给定的时间范围中获取每个国家/地区的访问次数。精细。有人可能会说丹迪。

我现在需要的是显示一个表格(忘记显示,我只需要查询帮助),这可以将访问分组到该月份的标题下的每个月。即每个月的国家/访问量。可能指定的时间戳为BETWEEN'2009-06-00'和'2009-06-30',其中的变量在变量顶部声明。

所以我需要从以下的倍数中得到: -

`id`   `ip`  `country`   `etc`
 1     24.124    uk    thisthat

要: -

`country`     `Jan`     `Feb`
 UK             44       77

现在,我已经在这里获得了帮助,之前已经声明了名称AS,但是这个查询的潜在复杂性使我感到fr and并且我不太清楚如何做到这一点,即使是嵌套的选择查询。

任何建议或指向正确的方向都会感激不尽。

2 个答案:

答案 0 :(得分:4)

MySQL有一些date and time functions,您可以使用它来解析时间戳字段,以及分组(即,您想要计算特定月份中某个国家/地区的所有记录,所以你' d按国家和年/月分组)。例如,如果按时间戳的年份和月份进行分组:

SELECT `country`, COUNT(`ip`) AS `cViews`,
  YEAR(`when`) AS `year`, MONTH(`when`) AS `month`
FROM `metrics`
WHERE `projID` = 'projID'
  AND `country` != 'XX'
  AND `when` BETWEEN '$dateFrom' AND '$dateTo'
GROUP BY country, YEAR(`when`), MONTH(`when`)

您的结果集看起来像

country  cViews  year  month
UK       44      2009  7
UK       75      2009  6
 ...

然后您可以使用PHP将数据组织成您想要的输出格式。

答案 1 :(得分:0)

您正在寻找的技术(将行映射到列)称为旋转。

不幸的是,它不是MySQL擅长的,因为它需要动态列数,而SQL编程范例意味着静态列数。

您可以执行以下操作:

SELECT  country,
        (
        SELECT  COUNT(*)
        FROM    metrics mjan
        WHERE   MONTH(mjan.`when`) = 1
                AND mjan.country = mo.country
        ) AS `Jan`,
        (
        SELECT  COUNT(*)
        FROM    metrics mfeb
        WHERE   MONTH(mfeb.`when`) = 2
                AND mfeb.country = mo.country
        ) AS `Feb`,
        …
FROM    metrics mo
GROUP BY
        country

,或者更好的是,发出此查询:

SELECT  country, MONTH('when'), COUNT(*)
FROM    metrics mo
GROUP BY
        country, MONTH(`when`)

并在php

上解析结果