Запросить отдельный список записей, используя ограничение NOT BETWEEN - PullRequest
0 голосов
/ 25 февраля 2011

Я пытаюсь построить запрос, который дает мне список отдельных записей после применения ограничения «НЕ МЕЖДУ» для полей даты в другой таблице.

Учитывая следующее ...

User Table:
magicID    name
100        Greg
200        Fred

Event Table:
magicID    date
100        2011-02-24
100        2011-02-23
100        2011-02-22
200        2011-02-22

Как я могу получить список отдельных пользователей, которые не попадают в определенный диапазон дат? Я хочу, чтобы это было очень явным. Если я ищу пользователей, у которых нет записей о событиях между 2011-02-23 и 2011-02-24, я бы ожидал получить один результат обратно,

200    Fred

Это цель. Но приведенный ниже запрос выдаст мне всех пользователей. Я хочу, чтобы ограничение «НЕ МЕЖДУ» было явным.

SELECT DISTINCT users.* FROM users, events WHERE events.date NOT BETWEEN '2011-02-23' AND '2011-02-24'

Этот запрос возвращает всех пользователей ...

100    Greg
200    Fred

Мне не хватает чего-то очень фундаментального ...

Ответы [ 4 ]

3 голосов
/ 25 февраля 2011

Поскольку сравниваемые значения не будут равны NULL, в MySQL наиболее эффективным вариантом будет LEFT JOIN / IS NULL :

   SELECT u.magicid,
          u.name
     FROM USER u
LEFT JOIN EVENT e ON e.magicid = u.magicid
                 AND e.date BETWEEN '2011-02-23' AND '2011-02-24'
    WHERE e.magicid IS NULL

Если столбцы обнуляются, лучшим вариантом будет NOT EXISTS :

SELECT u.magicid,
       u.name
  FROM USER u
 WHERE NOT EXISTS (SELECT NULL
                     FROM EVENT e
                    WHERE e.magicid = u.magicid
                      AND e.date BETWEEN '2011-02-23' AND '2011-02-24')
1 голос
/ 25 февраля 2011
Select ...
From users
Where Not Exists    (
                    Select 1
                    From events As E1
                    Where E1.magicid = users.magicid
                        And E1.date Between '2011-02-03' And '2011-02-24'
                    )
0 голосов
/ 25 февраля 2011

Попробуйте этот запрос

ВЫБЕРИТЕ РАЗЛИЧНЫХ пользователей. * ОТ пользователей ОСТАВЛЕНЫ СОЕДИНЕННЫЕ СОБЫТИЯ НА user.magicID = events.magicID ГДЕ events.date НЕ МЕЖДУ '2011-02-23' И '2011-02-24'

0 голосов
/ 25 февраля 2011

Вы совсем не присоединяетесь к своим столам. Вы сможете использовать:

SELECT DISTINCT users.* 
FROM users, events 
WHERE user.magicID = events.magicID
and events.date NOT BETWEEN '2011-02-23' AND '2011-02-24' 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...