Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.03.2016, 22:12   #1
grominfo
Форумчанин
 
Аватар для grominfo
 
Регистрация: 30.05.2011
Сообщений: 651
По умолчанию MySQL. Пакетное сравнение строк

Всем привет!

Есть парсер ютуб, который тягает инфу о видео и прописывает в базе. При парсинге видео он подхватывает ссылки на другие видео, которые хранятся в файле в виде сериализованного массива. То есть после парсинга каждого видео файл дополняется, а перед парсингом вырезается одна ссылка.

Нужно, чтобы в этот файл не попадали ссылки, которые уже в базе. На ум приходит только проверка в цикле. Но тогда нужно при каждой итерации посылать запрос в базу.

Можно ли как-то одним запросом послать список URl и получить обратно только те ссылки, которых нет в базе?
Создание, программирование и сопровождение сайтов любой сложности.
Изготовление программ на заказ.
Список услуг и портфолио на сайте www.andreygrom.ru
grominfo вне форума Ответить с цитированием
Старый 20.03.2016, 22:16   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

where url not in ('...','...',...)
перечень динамически
есть вариант и с временной таблицей с перечнем урлов
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 20.03.2016, 22:24   #3
grominfo
Форумчанин
 
Аватар для grominfo
 
Регистрация: 30.05.2011
Сообщений: 651
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
where url not in ('...','...',...)
перечень динамически
есть вариант и с временной таблицей с перечнем урлов
where url not in. А как я получу обратно список урлов, которых нет в базе? Они вернутся?

Про временную таблицу я тоже подумал сразу, но не знаю как с ней работать. Не можете показать на примитивном примере, который бы подошел к моему случаю?
Создание, программирование и сопровождение сайтов любой сложности.
Изготовление программ на заказ.
Список услуг и портфолио на сайте www.andreygrom.ru
grominfo вне форума Ответить с цитированием
Старый 20.03.2016, 22:34   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

not не пойдет. Скорее всего без него получить список тех, которые есть, а в коде разобраться которых нет. А если этот список в таблице будет, то тогда скорее всего в духе not exists напрямую получая перечень отсутствующих
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 20.03.2016, 22:38   #5
grominfo
Форумчанин
 
Аватар для grominfo
 
Регистрация: 30.05.2011
Сообщений: 651
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
not не пойдет. Скорее всего без него получить список тех, которые есть, а в коде разобраться которых нет. А если этот список в таблице будет, то тогда скорее всего в духе not exists
Дело в том, что со временем в базе будет много строк. Вытягивать их все, а потом двумя циклами перебирать.....

Я вот думаю, может просто создать еще одну таблицу, где хранить все ссылки и флаги (пропарсено\непропарсено). А полю задать первичный ключ и обновлять с ON DUPLICATE KEY...
Создание, программирование и сопровождение сайтов любой сложности.
Изготовление программ на заказ.
Список услуг и портфолио на сайте www.andreygrom.ru
grominfo вне форума Ответить с цитированием
Старый 20.03.2016, 22:50   #6
grominfo
Форумчанин
 
Аватар для grominfo
 
Регистрация: 30.05.2011
Сообщений: 651
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
not не пойдет. Скорее всего без него получить список тех, которые есть, а в коде разобраться которых нет. А если этот список в таблице будет, то тогда скорее всего в духе not exists напрямую получая перечень отсутствующих
А, простите. Понял теперь. Получить список тех, что уже в базе из нового списка урлов. Все понял. Да, этот вариант подходит. Спасибо!
Создание, программирование и сопровождение сайтов любой сложности.
Изготовление программ на заказ.
Список услуг и портфолио на сайте www.andreygrom.ru
grominfo вне форума Ответить с цитированием
Старый 20.03.2016, 22:50   #7
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,160
По умолчанию

а зачем DUPLICATE? вы что хотите что то обновлять? Если нет - IGNORE достаточно
ADSoft вне форума Ответить с цитированием
Старый 20.03.2016, 23:00   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Немного не так. Допустим есть список '1','2','3','4' . А в базе есть куча и в том числе '2' и '3'. Запросом
Код:
SELECT url from MyTable where url in ('1','2','3','4')
получатся те, которые есть в базе и в списке, т.е. только '2' и '3' без остальной кучи

Если же этот же список будет в какой-то таблице, то запросом
Код:
SELECT t.url FROM Temp t WHERE NOT EXISTS(SELECT 0 FROM MyTable m WHERE m.url=t.url)
получится '1' и '4'

Только нужно оценится, что лучше. Чем больше в in элементов, тем дольше. Допускаю, что еще возможны ограничения либо на их кол-во, либо на длину списка. Как-то в MS SQL сталкивался с этим. Запрос к временной отработает очень быстро, но нужно потрудиться над её созданием. Тоже время
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 20.03.2016 в 23:16.
Аватар вне форума Ответить с цитированием
Старый 20.03.2016, 23:14   #9
grominfo
Форумчанин
 
Аватар для grominfo
 
Регистрация: 30.05.2011
Сообщений: 651
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Немного не так. Допустим есть список '1','2','3','4' . А в базе есть куча и в том числе '2' и '3'. Запросом
Код:
SELECT url from MyTable where url in ('1','2','3','4')
получатся те, которые есть в базе и в списке, т.е. только '2' и '3' без остальной кучи

Если же этот же список будет в какой-то таблице, то запросом
Код:
SELECT t.url FROM Temp t WHERE NOT EXISTS(SELECT 0 FROM * MyTable m WHERE m.url=t.url)
получится '1' и '4'

Только нужно оценится, что лучше. Чем больше в in элементов, тем дольше. Допускаю, что еще возможны ограничения либо на их кол-во, либо на длину списка. Как-то в MS SQL сталкивался с этим. Запрос к временной отработает очень быстро, но нужно потрудиться над её созданием. Тоже время
В моем случае скорость значения не имеет. Мне нужно уменьшить до минимум кол-во запросов. Поэтому вот этот способ мне больше подходит. Тут будет всего два запроса: один на выборку, один на вставку. Хостер задает лимит на кол-во запросов в час.
Создание, программирование и сопровождение сайтов любой сложности.
Изготовление программ на заказ.
Список услуг и портфолио на сайте www.andreygrom.ru
grominfo вне форума Ответить с цитированием
Старый 20.03.2016, 23:44   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

На пост #7 обрати внимание. Возможно там решение всех проблем
http://ekimoff.ru/214/
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сравнение, добавление и обновление БД в mysql Lea123 Помощь студентам 1 27.12.2014 09:52
сравнение строк и исключение повторов в пределах 4 строк Dariloff Microsoft Office Excel 2 20.01.2013 23:33
Сравнение дат MySQL Cyworc БД в Delphi 3 04.03.2012 14:52
MySQL сравнение множества с множеством. vedro-compota SQL, базы данных 6 31.01.2011 14:05
Макрос на сравнение и подсчет в первом столбце строк, и сумирование значений этих строк в другом столбце Shpr0T Microsoft Office Excel 8 30.08.2010 17:52