Запрос: выбор строк, на которых нет в другой таблице ссылок

-Ронин2-

Новичок
Запрос: выбор строк, на которых нет в другой таблице ссылок

Подскажите, пожалуйста, как сделать правильно.

В таблице №1 хранится список сайтов
В таблице №2 хранится список сайтов, посещенных

Делаю запрос результатом которого будет список сайтов из "таблицы №1" минус просмотренные сайты (история о посещении которых транится в "таблице №2"), где просмотренные сайты должны быть были просмотрены вчера


ЗАПРОС:

select *
from `таблица1`
left join `таблица2` on `таблица1`.`сайт_ид`=`таблица2`.`сайт_ид`
where
`таблица2`.`дата_когда_не_надо_смотреть`<"сегодняшняя_дата"
 

iceman

говнокодер
WHERE date BETWEEN ... (между позавчерашней и сегодняшней датой), если правильно понял твой "вопрос"
 

-Ронин2-

Новичок
iceman
Мне кажется нет.

У нас есть два человека.
Один человек находит сайты. Второй их просматривает с какой-то периодичностью. Для каждого сайта этот период разный и человек сам его устанавливает.

Т.е. этим запросом я хочу сделать так чтобы тот человек, который смотри сайты, получал список сайтов для проверки. Эти сайты либо не проверялись, либо их нужно повторно смотреть.

В таблице2 я храню дату когда истекает срок одобрения сайта и нужно зайти его проверить. Это значение я храню в ячейке "дата_когда_не_надо_смотреть". И если дата когда смотрели стала меньше сегодняшней даты, то сайт появляется в списке сайтов для проверки.

-~{}~ 24.07.09 14:14:

Изменил немного запрос, но он не показывает те сайты, срок одобрения которых истек:

inner join
`таблица2` on `таблица1`.`сайт_ид`!=`таблица2`.`сайт_ид`
 

Gas

может по одной?
Изменил немного запрос:

inner join
`таблица2` on `таблица1`.`сайт_ид`!=`таблица2`.`сайт_ид`
и что? к каждой строке из первой таблице подтянется почти вся вторая таблица.

Я так сделал.
select *
from `таблица1`
left join `таблица2` on `таблица1`.`сайт_ид`=`таблица2`.`сайт_ид` AND `таблица2`.`дата_когда_не_надо_смотреть`<"сегодняшняя_дата"
where `таблица2`.`сайт_ид` IS NULL
 

-Ронин2-

Новичок
Автор оригинала: Gas
и что? к каждой строке из первой таблице подтянется почти вся вторая таблица.

Я так сделал.
select *
from `таблица1`
left join `таблица2` on `таблица1`.`сайт_ид`=`таблица2`.`сайт_ид` AND `таблица2`.`дата_когда_не_надо_смотреть`<"сегодняшняя_дата"
where `таблица2`.`сайт_ид` IS NULL
Ok. Щас рассмотрю. Спасибо.

У меня получилось вот при таком варианте:

(
select *
from `таблица1`
inner join `таблица2` on `таблица1`.`сайт_ид`!=`таблица2`.`сайт_ид`
)
UNION
(
select *
from `таблица1`
inner join `таблица2` on `таблица1`.`сайт_ид`=`таблица2`.`сайт_ид`
where
`таблица2`.`дата_когда_не_надо_смотреть`<"сегодняшняя_дата")
)

-~{}~ 24.07.09 14:35:

Сейчас обнаружил, что мой запрос дублирует записи.

Пробую запрос ГАС.

-~{}~ 24.07.09 14:42:

Gas
Не пойму какое условие наклдывает: where `таблица2`.`сайт_ид` IS NULL

Пожалуйста, подскажи.

-~{}~ 24.07.09 15:14:

За что отвечает IS NULL разобрался.

Сделал вот так:
PHP:
select * from `mod_websitelinks_sites` 

left join 
    `mod_websitelinks_razmeshennie` as `aa` on `mod_websitelinks_sites`.`s_id`=`aa`.`r_site_id` 
    and `aa`.`r_srok_date`<"2009-07-24" 

where
    and `aa`.`r_site_id` IS NOT NULL
но этот запрос не включает те сайты, которые еще не посещались (есть запись в mod_websitelinks_sites ,но нет записи в mod_websitelinks_razmeshennie)
 

Gas

может по одной?
Вернее по логике тут получается как-то так:

left join `таблица2` on `таблица1`.`сайт_ид`=`таблица2`.`сайт_ид` AND `таблица2`.`дата_когда_не_надо_смотреть` >="завтрашняя_дата"
where `таблица2`.`сайт_ид` IS NULL

Смысл тут простой, к первой таблице присоединяем только сайты которые нужно проверять _не сегодня_, а потом эти записи убираем условием в where. Следовательно остаются либо записи у которых нет связи со второй таблицей, либо записи у которых время проверки меньше чем завтра.
 

-Ронин2-

Новичок
select * from `mod_websitelinks_sites`

left join
`mod_websitelinks_razmeshennie` as `aa` on `mod_websitelinks_sites`.`s_id`=`aa`.`r_site_id`
and `aa`.`r_srok_date`>="2009-07-25"

where
`aa`.`r_site_id` IS NULL

Тестирую.
 
Сверху