2017-01-17 6 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- me-to-be-a-very-simple-sql-query Этот вопрос, поскольку он stansd является неопровержимым, потому что ключ находится внутри данных. – Shadow

+0

Как подсказка для вас, начните с чтения о [GROUP BY] (https://dev.mysql.com/doc/refman/5.5/ru/group-by-handling.html) –

ответ

1

Try:

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

и аналогично для других случаев. Это работает, потому что CASE возвращает NULL, если ни один из WHEN не согласован, а COUNT не учитывается NULL.

Ваша попытка не сработала, потому что тесты просто возвращают 0 или 1 в зависимости от того, успешны ли они, и вы просто подсчитываете все различные комбинации IP и логические. Он не исключает строк, в которых условие терпит неудачу.

+0

Это сработало отлично, и спасибо для объяснения. Очень полезно. –