2013-03-06 3 views
13

Для таблицы, в которой хранятся записи о посещении пользователем веб-страниц, как я могу выбрать пользователей, которые посещают более одной веб-страницы.выберите пользователей, имеющих несколько записей в mysql

Структура этих таблиц:

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

я могу рассчитывать с помощью:

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

Это дает мне результат, как:

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

Как я могу преобразования приложений запрос, дает мне окончательный результат:

userId 
    0 
    2 
... 

каждый пользователь, который посещают более одного DISTINCT веб-страниц

ответ

23

просто добавить предложения HAVING

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 

причина, по которой вы фильтруете на HAVING, а не на WHERE, потому что, WHERE статья не может поддерживать столбцы, где агрегировано.

+0

точно! Где не работает GROUP, если есть! – zoujyjs

+0

Кстати: Могу ли я использовать псевдоним «count» в предложении HAVING? – zoujyjs

+0

@zoujyjs да 'HAVING' clause поддерживает псевдоним уже .. см. Здесь 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 - это оптимизированный корпус, но нет причин, по которым планы должны быть разными. (Сравните планы по конкретной версии РСУБД/версии, если это проблема или проблема.)

Смежные вопросы