我现在正在为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并且我不太清楚如何做到这一点,即使是嵌套的选择查询。
任何建议或指向正确的方向都会感激不尽。
答案 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
方