2009-07-08 30 views
0

我正在爲mySQL查詢和語法提供高於我的權重的方式。我可以做一些幫助實現以下內容: -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,但這個查詢的潛在複雜性使我變得冷酷,我不太確定如何去做,即使是嵌套的select查詢也是如此。

任何意見或指向正確的方向感激地收到。

回答

4

MySQL有一些date and time functions,你可以用它來解析一個時間戳字段,也可以用於分組(即你想在一個特定的月份中統計一個國家的所有記錄,所以你可以按國家和年/月)。例如,如果你在當時間戳的年份和月份分組:

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來的數據組織成輸出你想要的格式。

+0

初步播放看來這可能工作在php側的結果,我將會探索更多的明天並回報。非常感謝。 – waxical 2009-07-08 18:22:28

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`) 

和解析