SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 04.12.2011 05:48:15

RX200
Участник
Зарегистрирован: 04.12.2011
Сообщений: 3

Как проверить на совпадение значения в MySQL

Здравствуйте. Помогите составить запрос.
Есть таблица содержащая больше миллиона записей. Один столбец в ней содержит числа.

Так же, в php, в цикле, формируется массив чисел содержащий примерно 32 значений.

Надо: Проверить есть ли в таблице совпадение хотя бы с одним числом из массива.

Алгоритм примерно такой: ПШП отправляет в таблицу массив чисел, В таблице проверяется совпадения чисел в массиве, с числами в таблице. Если совпадение найдено, то проверка прекращается(Тоесть не обязательно проверять на совпадение все числа в массиве), и возвращается логическое ДА, или если не одно число из массива не совпало то возвращается логическое НЕТ(Желательно чтоб именно логические значения возвращались а не записи).

Вот как записать этот алгоритм в одном запросе к MySQL??

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

Неактивен

 

#2 04.12.2011 05:53:07

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Как проверить на совпадение значения в MySQL

Здравствуйте.

Осуществить такую проверку прямо в один запрос - затруднительно, пожалуй.

Разве что как-то так:
select count(*) from t where number in (5,2,6,.....,3);
Обязательно создайте ключ на поле number, иначе будет сильно тормозить.

Или можно создавать еще одну таблицу (можно временную), содержащую эти 32 три числа и join-запросом получить нужный результат.

Или можно в php циклом пройтись по 32-м значениям и на каждое значение такой запрос:
select count(*) from t where number = ОЧЕРЕДНОЙ_ЭЛЕМЕНТ_МАССИВА;

Отредактированно deadka (04.12.2011 05:56:10)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 04.12.2011 06:40:21

RX200
Участник
Зарегистрирован: 04.12.2011
Сообщений: 3

Re: Как проверить на совпадение значения в MySQL

Второй вариант не годиться так как при каждой интеракции цыкла все эти 32 числа разные.
Третей вариант по моему будет долгим так как изначальный цыкал выполняется 300тысяч раз(У ПШП лимит времени отключен).
Первый вариант вероятно самый быстрый из предложенных вами, но в нём проверяются все числа, а мне нужно чтоб сократить время при нахождении первого освпадения, проверка остальных чисел(из 32 в массиве) не проводилась.

Но всёравно спасибо за ваш ответ.
Если есть ещё варианты прошу написать. Мне крайне важно сократить время запроса.

Неактивен

 

#4 04.12.2011 16:40:40

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Как проверить на совпадение значения в MySQL

Второй вариант: табличку можно создавать тогда, когда числа уже будут известны.
Третий вариант: при наличия ключа на number с чего бы ему быть дольше, чем остальным вариантам?
Первый вариант: не уверен, что можно составить запрос так, чтобы он прекратил своё выполнение при нахождении числа из этих 32-х, хотя могу ошибаться. Разве что как-то так:
select count(*)>0 from t where number in (5,2,6,.....,3);
Хотя едва ли оптимизатор будет так далеко продумывать...

И кстати, с циклом Вы можете контролировать совпадение с каким-то из чисел, а после цикл остановить.

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

Отредактированно deadka (04.12.2011 16:41:42)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 07.12.2011 06:09:52

RX200
Участник
Зарегистрирован: 04.12.2011
Сообщений: 3

Re: Как проверить на совпадение значения в MySQL

Мне на другом форуме вот так посоветовали:
select * from `my_table` where `my_table`.`my_number_column` in (1,2,3,4) limit 1;
Почти тоже что и у вас deadka но с лимитом)))
Но лимит не работает))
В итоге я выбрал ваш вариант)

Отредактированно RX200 (11.12.2011 15:57:56)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson