2013-02-19 3 views
1

У меня есть таблица вроде этого:Задать вопрос Запрос в MySQL

CreateDate | UserID 
2012-01-1 |  1 
2012-01-10 |  2 
2012-01-20 |  3 
2012-02-2 |  4 
2012-02-11 |  1 
2012-02-22 |  2 
2012-03-5 |  3 
2012-03-13 |  4 
2012-03-17 |  5 

Мне нужен запрос, чтобы показать UserID, который создан после 1 февраля 2013 года и не существует в базе данных Befor 1 февраля 2013

Из сказанного выше например, результат должен быть:

CreateDate | UserID 
2012-02-2 |  4 
2012-03-13 |  4 
2012-03-17 |  5 

Может ли он быть разрешен только в одном запросе без хранимой процедуры?

ответ

0

Это один из способов сделать это:

select 
    CreateDate, 
    UserID 
from Users 
where CreateDate >= '2012-02-01' 
and UserId not in (
    select UserId 
    from Users 
    where CreateDate < '2012-02-01' 
) 

SqlFiddle ссылка: http://www.sqlfiddle.com/#!2/7efae/2

+0

Ааа ... Черт ... Глупый мозг ...... Спасибо за вашу помощь .... вот ответ мне нужен ...... – Teddy

+0

@ JW Правильно, я отредактировал ответ. – GolfWolf

1

Вы можете использовать подзапрос, который отдельно получает в UserID, которые существуют до того Feb. 2, 2013 и результат подзапроса затем присоединился обратно на стол, используя LEFT JOIN.

SELECT a.* 
FROM tableName a 
     LEFT JOIN 
     (
      SELECT UserID 
      FROM tableName 
      WHERE CreateDate < '2013-02-01' 
     ) b ON a.userID = b.userID 
WHERE a.CreateDate > '2013-02-01' AND 
     b.userID IS NULL 

для повышения производительности, добавьте INDEX на колонке userID.

+0

Yess .... эта работа для ..... hmmm теперь, какой из них лучше для таблицы с большим количеством данных. Должен ли я использовать Left Join или SubQuery в WHERE? – Teddy

+0

Если вы правильно определили индекс в таблице, вам не нужно беспокоиться о производительности. –

+0

+1 для ссылки на производительность – GolfWolf

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