Выбор строк на основе даты и других таблиц - PullRequest
1 голос
/ 27 марта 2009

У меня есть три таблицы:

computers, which has columns for id, serial number, make, model, etc
users, which has columns for id, real name
computer_usage, which has columns id, computer_id, user_id, start_date, end_date

В базу данных записываются все компьютеры, которые у нас есть, наши пользователи и кто и когда использовал этот компьютер.

Я хочу выполнить запрос, который выбирает все компьютеры, у которых нет текущего пользователя.

Это будет:

Существует computer_id, который вообще не существует в computer_usage или же Существует computer_id, который существует в computer_usage с конечной датой

Каков наилучший способ выбора этих записей?

1 Ответ

3 голосов
/ 27 марта 2009

Попробуйте это:

SELECT * 
FROM computers 
WHERE id NOT IN 
    (SELECT computer_id 
     FROM computer_usage
     WHERE end_date is NULL)

Подзапрос показывает все компьютеры, которые в данный момент используются (запись существует, поэтому мы предполагаем, что у нее есть дата начала, но дата конца не назначена).

Я предполагаю, что end_date не заполняется до тех пор, пока «использование» не будет завершено. Если это не правильно (например, если заранее назначены даты окончания), просто выполните:

SELECT * 
FROM computers 
WHERE id NOT IN 
    (SELECT computer_id 
     FROM computer_usage
     WHERE start_date < getDate()
     AND end_date > getDate())

В подзапросе по-прежнему отображаются все компьютеры, которые в данный момент «находятся в назначении». Просто найдите все компьютеры, не входящие в эту группу. (Обратите внимание, что я использовал «getDate», которая является функцией MS SQL. Я думаю, что аналог mysql связан с TIMESTAMP.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...