Подскажите: выбор несовпадающих id

ys

отодвинутый новичок
Подскажите: выбор несовпадающих id

Доброго времени суток.

Я тут чуствую себя полным идиотом.
Ситуация простая как тапок:

таблица:

id (auto_increment)
...порчие поля.

В результате аппаратных сбоев пришлось сделать таблице "rapair table ...."
В итоге, некоторые записи не бЫли восстановлены, а просто удалены.

Есть ежедневный бекап, который я и залил в ОТДЕЛЬНУЮ таблицу.
Теперь вот хочу выбрать те записи (по id), которые есть в backup, но которых нету в первоначальной таблице (обратного не нужно).

Вот тут то у меня мозг и закончился.
Как это сформулировать?
Можно, конечно и SQL языком, но лудше, для более полного понимания, на русском алгоритмическом...

P.s: Выбрать совпадающие записи получилось без всяких проблем, а вот различающиеся - я видимо туп для этого...
 

BRat

o_0
ys
"которых нету". Из этого следует, что у этих записей в первой таблице id равен NULL. Еще подсказка нужна?)
 

SunDrop

Помощник поисков. робота
SELECT из бекапа
LEFT JOIN основная (по ID)
WHERE основная.ID IS NULL

Идею уловил?
 

ys

отодвинутый новичок
Я видимо ввел вас в заблуждение, но тех которых нету - их нету, причем совсем.
Они не могут быть NULL, т.к.:

id int(16) not null auto_increment
 

Фанат

oncle terrible
Команда форума
ys
тебе не говорили высказывать своё авторитетное мнение на форуме.
тебе дали запрос к исполнению.

зы. int(16) - это круто. В военное время значение синуса может ждостигать 4-х...
 

ys

отодвинутый новичок
Автор оригинала: BRat
ys
"которых нету". Из этого следует, что у этих записей в первой таблице id равен NULL. Еще подсказка нужна?)
Записи которых нету - это значит что их нету, и id не может быть чему то равен в силу того, что такой записи просто нету. И что то там не может быть равно NULL, потому-что то, чего нету не может быть равно чему бы то нибыло!

-~{}~ 18.10.06 23:32:

Автор оригинала: Фанат
ys
тебе не говорили высказывать своё авторитетное мнение на форуме.
тебе дали запрос к исполнению.

зы. int(16) - это круто. В военное время значение синуса может ждостигать 4-х...
Согласен. пошел еще раз пробовать.
int(16) - да согласен :)

-~{}~ 18.10.06 23:41:

Результат:
Empty set (0.00 sec)

плохо :(
 

Gorynych

Посетитель PHP-Клуба
если я правильно понял, то изначально речь шла о том, чтобы залить из бэкапа те записи, которые отсутствуют (были повреждены) в основной таблице.

а почему никто не вспомнил про опцию INSERT IGNORE INTO ... - http://dev.mysql.com/doc/refman/4.1/en/insert.html - которая вроде как раз и делает вставку игнорируя повторы?
 

ys

отодвинутый новичок
Автор оригинала: Gorynych
если я правильно понял, то изначально речь шла о том, чтобы залить из бэкапа те записи, которые отсутствуют (были повреждены) в основной таблице.

а почему никто не вспомнил про опцию INSERT IGNORE INTO ... - http://dev.mysql.com/doc/refman/4.1/en/insert.html - которая вроде как раз и делает вставку игнорируя повторы?
Это уже вторая, более простая, задача.

Я думаю, что, если в следствии креша записи не удалось восстановить по REPARE, то,наверно, в этот момент с ними производились какие-то действия по их изменению.

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

Я решил плюнуть на sql и сделал это простеньким скриптом на php из 10 строчек.

Но интересна на будущее само решение этой задачи средствами sql.
Вот я легко могу получить те id, которые есть и в одной и в другой таблице, но не могу решить обратную задачу, что странно...
 

WP

^_^
Мдя, пациент скорее мертв чем жив. Квасторка тут вряд ли поможет.
Понимаешь, когда LEFT JOIN не находит подходящих записей в подключаемой таблице, он просто заполняет поля этой таблицы в соответствующем ряду значениями NULL.
Понимаешь? И там глубоко пох у тебя not null или нет в тех полях, ему на это класть с прибором. Советую покурить пример BRat'а.

-~{}~ 19.10.06 12:18:

[sql]SELECT *
FROM `t1`
LEFT JOIN `t2` ON 0
[/sql]
Запусти для закрепления.
 

ys

отодвинутый новичок
O! Докурил, спасибо!


select backup.id from backup left join ent on backup.id=ent.id where ent.id is null;
 
Сверху