2011-11-17 42 views
-1

請看看這個查詢:MySQL查詢的非常複雜的結構化

SELECT DATE(datetime), COUNT(1) as numVisits 
FROM ".table_stats." 
WHERE type='profile_visit' 
    AND user_url = '".$_GET['ref']."' 
    AND id_user='".$_SESSION['user_code']."' 
GROUP BY DATE(DATE_SUB(datetime, INTERVAL 1 DAY)) 

此查詢計算的次數是等於「profile_visit」每個日期,結果它給了我兩行(DATE(datetime),numVisits)。這是表table_stats的屏幕截圖: Table 1 Table_Stats


好了,到現在爲止,你可以知道每一位用戶來到一個新元素插入的表類型的網站時 = profile_visit和datetime字段與訪問的日期和時間,這就是爲什麼我使用GROUP BY DATE(日期時間)來計算一天中的總訪問數。

來了複雜的部分,當類型字段等於「點擊」和起源是「小鬼」就意味着,用戶點擊頁面上的特定按鈕,我會想知道如何很多時候該按鈕被點擊(不管ip),就像我在配置文件訪問時一樣。

我只能通過日期時間是「點擊」和起源是「小鬼」分組做兩個querys,一個知道的總次數(如一個前)和另一個相似。

問題是,我只想在一次調用中進行此操作,以計算NumVisits這一行中按日期訪問的總訪問次數,並將新行命名爲NumClick,並獲得所有點擊次數。這就是爲什麼我不想在我的PHP服務器上進行更多的計算,如果它可能會很好,使所有在SQL服務器上的計算。

所以最後,如果調用此查詢表:

SELECT DATE(DATETIME) , COUNT(1) AS numVisits 
FROM stats_ram 
WHERE TYPE = 'profile_visit' 
AND user_url = 'xxx' 
AND id_user = '88e91' 
GROUP BY DATE(DATE_SUB(DATETIME, INTERVAL 1 
DAY)) 
LIMIT 0 , 30 

您將獲得:

DATE(datetime) numVisits 
2011-11-16  7 

我如何添加其他行與總類型=點擊和產地= IMP由DATE製作(日期時間)?

感謝您的幫助!第一

+1

第一件事,請不要在你的SQL直接使用$ _GET ... –

+0

不要擔心安全問題,這只是一個例子 – DomingoSL

+0

@DomingoSL:插值'$ _GET'直接進入的聲明表明有是代碼的其他問題,比如你根本沒有使用準備好的語句插入值。 – outis

回答

3
SELECT 
    DATE(DATETIME), 
    SUM(CASE WHEN type = 'profile_visit' THEN 1 ELSE 0 END) AS numVisits, 
    SUM(CASE WHEN type = 'click' AND origin = 'imp' THEN 1 ELSE 0 END) numClicks 
FROM stats_ram 
WHERE user_url = 'xxx' 
    AND id_user = '88e91' 
GROUP BY DATE(DATE_SUB(DATETIME, INTERVAL 1 DAY)) 
LIMIT 0, 30 
+0

完美!謝謝!!!! – DomingoSL