2013-03-06 9 views
13

Aby uzyskać tabelę zawierającą zapisy zachowań użytkowników stron internetowych, w jaki sposób mogę wybrać użytkowników, którzy odwiedzają więcej niż jedną stronę internetową.wybierz użytkowników, którzy mają więcej niż jeden odrębny rekord w mysql

Struktura tego tabelach:

userId  webpageId  visitTime 
    0    123   ... 
    0    124   ... 
    1    123   ... 
...    ...   ... 

mogę liczyć przy użyciu:

SELECT userId, COUNT(DISTINCT webpageId) AS count FROM visits GROUP BY userId; 

To daje mi wynik jak:

userId   count 
    0    2 
    1    1 
    2    6 
...    ... 

Jak mogę excute kwerendy daje mi końcowy wynik, taki jak:

userId 
    0 
    2 
... 

każdy jest użytkownik, który odwiedzić więcej niż jeden odrębny stron internetowych

Odpowiedz

23

wystarczy dodać HAVING

SELECT userId, COUNT(DISTINCT webpageId) AS count 
FROM visits 
GROUP BY userId 
HAVING COUNT(DISTINCT webpageId) > 1 

ale jeśli tylko co ID

SELECT userId 
FROM visits 
GROUP BY userId 
HAVING COUNT(DISTINCT webpageId) > 1 

Powód, dla którego filtrujemy klauzulę , a nie WHERE, ponieważ klauzula WHERE nie obsługuje kolumn, w których zagregowana jest.

+0

dokładnie! Gdzie nie działa dla grupy, mając! – zoujyjs

+0

btw: Czy mogę używać alias 'count' w klauzuli HAVING? – zoujyjs

+0

@zoujyjs tak Klauzula "HAVING" obsługuje już pseudonim. Zobacz tutaj http://sqlfiddle.com/#!2/049e0/4 –

5

Spróbuj tego:

SELECT userId, COUNT(DISTINCT webpageId) AS count FROM visits GROUP BY userId 
having COUNT(DISTINCT webpageId) > 1 

Więcej: HAVING

+0

THX! to działa! – zoujyjs

2

Podczas HAVING jest dobrym podejściem w tym przypadku należy pamiętać, że pytania mogą być zagnieżdżane:

SELECT userId, pageCount 
FROM (
    SELECT userId, COUNT(DISTINCT webpageId) AS pageCount 
    FROM visits 
    GROUP BY userId) AS n 
WHERE pageCount > 1 

Rzeczywiste plany zapytanie może różnią się, zwłaszcza jeśli HAVING jest zoptymalizowanym przypadkiem, ale nie ma powodu, dla którego plany muszą być różne. (Porównaj plany dotyczące konkretnej wersji RDBMS, jeśli jest to problem lub problem).

Powiązane problemy