2017-01-17 3 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 

Ich habe die folgende vorbereitete Anweisung, wo ich versuche, Statistiken für eine Webseite zu bekommen. Das Ziel besteht darin, sowohl die Anzahl der Ladevorgänge für jede der drei Seiten anzugeben, als auch die Anzahl der Ladevorgänge für jede der drei Seiten durch eine eindeutige IP-Adresse. Ich bin neu in der Verwendung von distinct, also nicht einmal sicher, ob es das Richtige ist, aber ich bekomme nicht das richtige Ergebnis, also nehme ich an, dass ich es falsch gebrauche.MySQL: Get Unique Count von mehreren Spalten

Ich dachte, ich könnte einfach eine andere SELECT-Anweisung als t2 machen, aber versuchen, das zu vermeiden, da ich die hinzufügen muss? Variablen immer und immer wieder, je mehr ich es hinzufüge, so hoffte ich, es kondensiert zu haben, wenn möglich.

+1

Siehe die folgende Anleitung, wie man eine gute sql Frage stellt: http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to- Ich-bin-eine-sehr-einfache-SQL-Abfrage Diese Frage als stansd ist nicht zu beantworten, da der Schlüssel innerhalb der Daten ist. – Shadow

+0

Als Hinweis für Sie, beginnen Sie mit dem Lesen von [GROUP BY] (https://dev.mysql.com/doc/refman/5.5/en/group-by-handling.html) –

Antwort

1

Versuchen:

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

und in ähnlicher Weise für die anderen Fälle. Dies funktioniert, weil CASENULL zurückgibt, wenn keine der WHEN-Klauseln übereinstimmt, und COUNT zählt nicht NULL.

Ihr Versuch hat nicht funktioniert, da die Tests einfach 0 oder 1 zurückgeben, je nachdem, ob sie erfolgreich sind, und Sie zählen nur die verschiedenen Kombinationen der IP und der Boolean. Es schließt die Zeilen nicht aus, in denen die Bedingung fehlschlägt.

+0

Dies funktionierte perfekt, und ich danke Ihnen für die Erklärung. Sehr hilfreich. –