Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > Выбор записей из т1, чтобы таких не было в т2


Автор: godsgame 22.7.2006, 22:08
Выбираю записи в таблице1, но нужно выбрать эти записи так, чтобы записи с таким же ИД (поле) не существовало в таблице2.
Можно ли обойтись 1 запросом?

пример:
таблица1: (ИД, ТЕКСТ)
1, 123
2, 456
3, 799

Таблица2:
1, 123
3, 799

Выбирет ТОЛЬКО 2-ую (2, 456) запись в таблице1.
 

Автор: Gold Dragon 22.7.2006, 22:47
по моему так (нет возможность проверить сейчас)
Код

SELECT * FROM таблица1, таблица2 WHERE таблица1.id!=таблица2.id


Добавлено @ 23:02 

в общем что-то написал какую то ерунду, не работает  smile 

вот
Код

SELECT * FROM таблица1 WHERE id NOT IN (SELECT `id` FROM таблица2)
 

Автор: godsgame 23.7.2006, 11:53
Gold Dragon, 
спасибо, работает! 

Автор: Drache 24.7.2006, 08:30
вообще можно так сказать "специально" для таких целей есть left join.
Ну он то может и не сспециально для атких целей, но в таких случаях точно применяется.

select * from t1 left join t2 using(id) where t2.id is null 

Автор: Ignat 24.7.2006, 09:06
godsgame, рекомендую воспользоваться советом Drache. 

Автор: Gold Dragon 24.7.2006, 09:08
Ignat, поясни 

Автор: Ignat 24.7.2006, 09:17
Gold Dragon, твой вариант с подзапросом. Первоначально будут выбраны все записи из т2, при этом они попадут по временную таблицу. Далее будет сравнение каждой записи из т2 с каждой записью из временной таблицы.

В случае с LEFT JOIN нет подзапроса, поля для связывания (как правило) проиндексированы, следовательно будут выбраны только те записи, для которых было сопоставление с ключом NULL. Это значит, что производительность запроса с LEFT JOIN выше. 

Автор: Gold Dragon 24.7.2006, 09:19
Ignat, хочешь сказать, что все подзапросы выполняются намного медленнее? И как сильно загружают?
 

Автор: Ignat 24.7.2006, 09:53
Цитата(Gold Dragon @  24.7.2006,  10:19 Найти цитируемый пост)
Ignat, хочешь сказать, что все подзапросы выполняются намного медленнее? И как сильно загружают?
  

Не обязательно на много, но то что медленнее - факт. Ведь это по сути два запроса. Хотя при неправлиьном соединении таблиц можно получить результат плачевнее подзапроса. Загрузка также зависит от объема. 

Автор: Gold Dragon 24.7.2006, 12:30
Ignat, по логике вещей ты может и прав... но если запрос очень сложный, то его намного легче читать, особенно когда уже не помнишь что хотел  smile  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)