2013-03-06 3 views
13

Für eine Tabelle, die Datensätze von Benutzer-Webseiten-Besuchsverhalten enthält, wie kann ich Benutzer auswählen, die mehr als eine Webseite besuchen.Wählen Sie Benutzer haben mehr als eine eindeutige Datensätze in Mysql

Die Struktur dieser Tabellen ist:

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

ich mit zählen:

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

Es gibt mir das Ergebnis wie:

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

Wie kann ich Abfrage excute dass gibt mir das Endergebnis wie:

userId 
    0 
    2 
... 

jeweils Benutzer, die mehr als eine unterschiedliche Web-Seiten besuchen

Antwort

23

nur Klausel

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

mit hinzufügen, aber wenn Sie nur das, was die ID

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

Der Grund, warum Sie auf HAVING-Klausel filtern und nicht auf WHERE ist, weil WHERE Klausel Spalten nicht unterstützt, die aggregiert wurden.

+0

genau! Wo funktioniert nicht für GROUP, hat es! – zoujyjs

+0

BTW: Kann ich Alias ​​'Count' in HAVING-Klausel verwenden? – zoujyjs

+0

@zoujyjs ja 'HAVING'-Klausel unterstützt Alias ​​bereits .. siehe hier http://sqlfiddle.com/#!2/049e0/4 –

5

Versuchen Sie folgendes:

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

Mehr: HAVING

+0

THX! das funktioniert! – zoujyjs

2

Während HAVING ein guter Ansatz in diesem Fall ist, denken Sie daran, dass Abfragen verschachtelt werden können:

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

Die tatsächlichen Abfragepläne können unterscheiden, vor allem, wenn HAVING ein optimierter Fall ist, aber es gibt keinen Grund, warum die Pläne anders sein müssen. (Vergleichen Sie die Pläne für die spezifische RDBMS/Version, wenn es sich um ein Problem oder Problem handelt.)

Verwandte Themen