2017-01-17 52 views
0
SELECT numTimesIndexLoaded, numTimesIndexLoadedUnique, numTimesResultsLoaded, numTimesResultsLoadedUnique, numTimesCTALoaded, numTimesCTALoadedUnique 
FROM 
(SELECT 
sum(ctaSL.page = 'index') AS numTimesIndexLoaded, 
sum(ctaSL.page = 'results') AS numTimesResultsLoaded, 
sum(ctaSL.page = 'cta') AS numTimesCTALoaded, 
count(distinct ctaSL.ip_address, ctaSL.page = 'index') AS numTimesIndexLoadedUnique, 
count(distinct ctaSL.ip_address, ctaSL.page = 'results') AS numTimesResultsLoadedUnique, 
count(distinct ctaSL.ip_address, ctaSL.page = 'cta') AS numTimesCTALoadedUnique 
FROM 
stats_page_loads AS ctaSL 
WHERE ctaSL.campaign_id = ? 
    AND ctaSL.mode = ? 
) t1 

我有以下準備好的聲明,我試圖獲取網頁的統計信息。我們的目標是讓這三個頁面中的每個頁面加載的次數統計爲兩次,而且還要爲這三個頁面中的每一頁的唯一IP地址加載多少次。我對使用獨特的新手很陌生,所以不確定它是否正確,但我沒有得到正確的結果,所以我假設我錯誤地使用了它。MySQL:從多列中獲取唯一計數

我想我可以做另一個SELECT語句作爲t2,但試圖避免,因爲我將不得不添加?變量一遍又一遍地增加,所以希望儘可能將它壓縮成一個變量。

+1

請參閱以下指南如何問一個好的sql相關問題:http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-這是一個非常簡單的sql查詢這個問題,因爲它的stansd是無法回答的,因爲密鑰在數據中。 – Shadow

+0

作爲提示,首先閱讀[GROUP BY](https://dev.mysql.com/doc/refman/5.5/en/group-by-handling.html) –

回答

1

嘗試:

count(DISTINCT CASE WHEN ctaSL.page = 'index' THEN ctaSL.ip_address END) AS numTimesIndexLoadedUnique, 

和類似的其他情況。這是有效的,因爲CASE返回NULL如果沒有WHEN子句匹配,COUNT不包括NULL

您的嘗試不起作用,因爲測試只是返回01,具體取決於它們是否成功,並且您只是計算IP和該布爾值的所有不同組合。它不排除條件失敗的行。

+0

這個工作完美,謝謝爲解釋。很有幫助。 –