2012-03-04 3 views
0

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

SELECT DATE(registered) 
FROM users 
WHERE user_id= ".$currentUser." 
ORDER BY registered ASC 
LIMIT 1 

Мне нужно изменить исходный запрос путем присоединения другой таблицы, чтобы убедиться, что пользователь не присутствует в этой второй таблице («доступа»), где член ID находится ниже определенного значения и дата ACCESS является ниже определенной даты.

LEFT JOIN access ON (users.user_id = access.user_id) 
WHERE access.user_id < 500 
AND access.date ... after March 1, 2012 

Не знаете, как получить эти два вместе.

ответ

2

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

SELECT DATE(u.registered) 
    FROM users u 
    WHERE u.user_id = ".$currentUser." 

    AND NOT EXISTS (
      SELECT 1 
       FROM access a 
       WHERE u.user_id = a.user_id 
       AND a.user_id < 500 
       AND a.date > DATE '2012-03-01') 

ORDER BY registered ASC 
LIMIT 1; 

Некоторых Примечания:
Вы по-прежнему получаете строку назад, даже если в таблице access нет соответствующих строк (строк).
Возможно, вы знаете это ... ASC - это порядок сортировки по умолчанию, поэтому вам не нужно вводить его.

+0

Отлично! Я просто подумал о чем-то. Мне нужна дата, чтобы быть a.date> DATE '2012-03-01', но она не может быть сегодняшней датой ... Могу ли я просто добавить AND a.date! = NOW()? – santa

+1

Да, добавьте еще одну строку в подзапрос: 'AND a.date <> CURDATE()' – bernie

2

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

... 
LEFT JOIN access ON (
    users.user_id = access.user_id 
    AND access.user_id < 500 
    AND access.date >= '20120301' 
) 
WHERE access.user_id is null 
... 
+0

«из одного стола, когда нет в другом» = анти-соединение. – onedaywhen

+0

@onedaywhen: Да, это то, что вы делаете, когда используете левое соединение и проверяете нулевые значения. – Guffa

+0

@onedaywhen: Если вам повезет, планировщик запросов превратит 'not exists()' в левое соединение, потому что он намного эффективнее. – Guffa

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