2013-03-06 9 views
13

ユーザーのWebページの訪問動作のレコードを保持するテーブルについて、複数のWebページにアクセスするユーザーを選択するにはどうすればよいですか。選択したユーザーがmysqlに複数の異なるレコードを持っています

このテーブルの構造は次のとおりです。

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

私が使用してカウントすることができます:

どのように私は、クエリにexcuteでき
userId   count 
    0    2 
    1    1 
    2    6 
...    ... 

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

それは私のような結果が得られます最終結果は次のようになります。

userId 
    0 
    2 
... 

それぞれが複数のDISTINCTウェブページが

答えて

23

ちょうど句

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

しかし、あなただけで何ID

SELECT userId 
FROM visits 
GROUP BY userId 
HAVING COUNT(DISTINCT webpageId) > 1 
場合を持つ追加訪れるユーザーです

WHERE句ではHAVING句でフィルタリングする理由は、WHERE句では、が集約された列をサポートできないためです。です。

+0

正確に! GROUPのどこで動作しないのですか? – zoujyjs

+0

btw:HAVING句で別名 'count'を使用できますか? – zoujyjs

+0

@zoujyjsはい 'HAVING'節はエイリアスを既にサポートしています..ここを見てくださいhttp://sqlfiddle.com/#!2/049e0/4 –

5

これを試してみてください:

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

より:HAVING

+0

THX!それは動作します! – zoujyjs

2

HAVINGが、この場合の良い方法ですが、クエリは入れ子にすることができることを覚えておいてください:

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

実際のクエリプランかもしれません特にHAVINGが最適化されている場合は特に異なりますが、計画が異なる必要がある理由はありません。 (問題または懸案事項であれば、特定のRDBMS /バージョンの計画を比較してください)

関連する問題