Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Найти отсутвуюшие значения, показать чего нет в базе 
V
    Опции темы
_Y_
Дата 23.11.2007, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: нет
Всего: 34



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

show create table permanentTable;
CREATE TABLE `permanentTable` (
  `symbol` varchar(100) default NULL,
  `fieldP1` varchar(50) default '-',
  `fieldP2` varchar(510) default '-',..........

CREATE TEMPORARY TABLE tempTable(symbol varchar(100), fieldT1 varchar(40));
LOAD DATA LOCAL INFILE '//dir/file.txt' INTO TABLE tempTable;

Но как теперь, сравнив содержание полей symbol, получить список значений отсутствующих в permanentTable?




--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
skyboy
Дата 23.11.2007, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



поясни подробнее. лучше на примере. тебе надо найти записи в таблице, в которой в поле fieldP1 находится значение, отсуствующее в поле fielDP2 во всех записях?
PM MAIL   Вверх
SelenIT
Дата 23.11.2007, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 6
Всего: 401



Единственный вариант, который вижу я - это что-то вроде
Код

SELECT tempTable.* FROM tempTable 
LEFT JOIN permanentTable
ON tempTable.symbol = permanentTable.symbol
WHERE permanentTable.symbol IS NULL

Наверное, хорошо бы permanentTable.symbol сделать индексом...


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
_Y_
Дата 23.11.2007, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: нет
Всего: 34



Цитата(skyboy @ 23.11.2007,  12:38)
поясни подробнее. лучше на примере. тебе надо найти записи в таблице, в которой в поле fieldP1 находится значение, отсуствующее в поле fielDP2 во всех записях?

Надо найти значения tempTable.symbol отсутствующие во всех записях permanentTable.symbol. Например если
Код

SELECT symbol FROM tempTable;
+--------+
| symbol |
+--------+
| ФГХИЙ  | 
| AБЦДЕ  | 
| КЛМНО  | 
+--------+
SELECT symbol FROM permanentTable
+--------+
| symbol |
+--------+
| ФГХИЙ  | 
| КЛМНО  | 
+--------+

То результатом поиска должно быть значение AБЦДЕ


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
Бонифаций
Дата 23.11.2007, 13:39 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 827
Регистрация: 15.9.2005
Где: Brisbane

Репутация: 20
Всего: 40



select * from temptable where symbol not in (select symbol from permanantTable)

другой вариант (чуть быстрее)

select * from tempTable where not exists (select * from permanentTable where permanentTable.symbol=tempTable.symbol);

третий вариант - самы быстрый (при наличии индексов)


 select t.* from t  tempTable left join p permanentTable using (symbol) where p.symbol is null;



Это сообщение отредактировал(а) Бонифаций - 23.11.2007, 13:47


--------------------
 Бонифаций.
 
PM MAIL ICQ Skype GTalk Jabber YIM   Вверх
_Y_
Дата 23.11.2007, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: нет
Всего: 34



SelenIT, работает. Берет где-то 8 минут. Многовато, но переживу на этот раз - свое время дороже. Надо бы еще разобраться как работает smile 
Бонифаций, тоже работает, берет 9 минут. Собственно, это то, с чето я начинал, но почему-то время жрало бесконечно. Может я в чем-то ошибся в первый раз.

Спасибо!


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
Бонифаций
Дата 23.11.2007, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 827
Регистрация: 15.9.2005
Где: Brisbane

Репутация: 20
Всего: 40



а сколько записей?


--------------------
 Бонифаций.
 
PM MAIL ICQ Skype GTalk Jabber YIM   Вверх
_Y_
Дата 28.11.2007, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: нет
Всего: 34



Цитата(Бонифаций @ 23.11.2007,  16:52)
а сколько записей?

Записей в основной таблице порядка трех миллионов, во временной - не больше сотни. Но тему пожалуй стОит закрыть т.к. практическая проблема решена. Да и пример мой в начале темы сильно упрощенный.


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0577 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.