2015-08-20 3 views
-2

У меня есть visits таблицу с тремя столбцами userid, url, посещения пользователей dateКакой должна быть правильно MySQL Query для ниже требования

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

Теперь я хочу, чтобы список url посетил сегодня (userid), но не вчера.

Это текущий запрос, который я пытаюсь.

SELECT clickid 
FROM visits 
WHERE userid='221001' 
    AND date = '2015-08-20' 
    AND clickid NOT IN (SELECT clickid FROM visits WHERE userid='221001' AND date = '2015-08-19') 

, но этот запрос занимает слишком много времени. Наша таблица может иметь до 0,2 М строк во внутреннем запросе

Как я могу сделать это простым и быстрым?

+0

Вы ищете оператор 'GROUP BY'. – Cyrbil

+0

Как и комментарии выше, рассмотрите следующий простой двухэтапный курс действий: 1. Если вы еще этого не сделали, укажите надлежащие DDL (и/или sqlfiddle), чтобы мы могли легче реплицировать проблему. 2. Если вы еще этого не сделали, укажите желаемый набор результатов, соответствующий информации, представленной на шаге 1. – Strawberry

+0

отредактировал мой вопрос. –

ответ

0

От the answer:
В большинстве случаев JOIN s быстрее, чем подзапросы и очень редко для суб-запрос, чтобы быть быстрее.

В JOIN s РСУБД может создать план выполнения, который лучше подходит для вашего запроса, и может предсказать, какие данные должны быть загружены для обработки, и сэкономить время, в отличие от подзапроса, где он будет запускать все запросы и загружать все свои запросы данные для обработки.

Хорошая вещь в подзапросах заключается в том, что они более читабельны, чем JOIN: вот почему большинство новых людей SQL предпочитают их; это простой способ; но когда дело доходит до производительности, JOIN s лучше в большинстве случаев, даже если их читать не сложно.

Так, пожалуйста, попробуйте это и скажите нам результат:

select clickid 
    from visits v1 
      left join visits v2 on v1.clickid = v2.clickid and v2.date = '2015-08-19' 
    where v1.userid= '221001' 
     and v1.date = '2015-08-20' 
     and v2.clickid is null 

Или используйте NOT EXISTS:

SELECT v1.clickid 
FROM visits v1 
WHERE v1.userid='221001' 
    AND v1.date = '2015-08-20' 
    AND NOT EXISTS (SELECT NULL FROM visits v2 WHERE v2.userid=v1.userid AND v2.date = '2015-08-19') 

PS: Если столбцы по сравнению (userid) не обнуляемым, LEFT JOIN выполняет лучший на MySQL. Если столбцы являются нулевыми (значение может быть NULL), то NOT EXISTS выполняют лучше.

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