[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Можно ли сделать такой запрос без цикла?
Страницы: 1, 2, 3
GET
Привет, можно ли как-то реализовать такой запрос по другому?

есть таблица id((int)primary)/int2

По int2 есть index

Есть массив значений для $int2 = [1,24,5]; (~ элементов до 100 может быть)

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

Можно было бы сделать обычный php цикл в котором делать запрос://рассчитывая что быстро попадется
foreach($int2 as $val)
{
if(!$s=mysql::query("SELECT 1 FROM `tab` WHERE `int2`=$val LIMIT 1"))
{
echo 'ok';//такого значения нет
break;//выходим с цикла
}
}



Еще можно посчитать:
$N=count($int2);//сколько изначально

if(!$M=mysql::count("SELECT COUNT(*) AS `count` FROM `tab` WHERE `int2` IN ('".implode("','",$val)."') GROUP BY `int2`"))$M=0;

if($M!==$N)
{
echo 'ok';//число элементов не совпало какого-то значения точно нет
}


Может посоветуете более простой способ или какой по вашему удобнее?

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
McLotos
Вообще, на сколько мне известно. засовывать запрос в цикл это плохая практика.
в sql запрос можно поставить OR и таким образом узнать есть ли хоть один результат

_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
GET
Цитата
Вообще, на сколько мне известно. засовывать запрос в цикл это плохая практика

100%

Наверное можно сделать подзапросом и переложить этот цикл на MYSQL но мне кажется логика не изменится.

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
GET
Цитата
в sql запрос можно поставить OR и таким образом узнать есть ли хоть один результат


Мне не нужно есть ли хоть один! Мне нужно нет ли хотя бы одного!

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
GET
Если поставить NOT IN он что-то найдет и это не решение

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
McLotos
Цитата (ABC @ 8.07.2014 - 15:52)
count("SELECT COUNT(*)

не совсем понял этот момент кода.
SELECT COUNT(id) FROM table WHERE int2>0 AND int2<101
как вариант?

_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
McLotos
Это если нужно узнать только количество.
А если получить их ID то без Count. тогда мы получаем массив в котором лежат все ID элементов у которых поле int2 больше 0 и меньше 101

_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
GET
Цитата
SELECT COUNT(id) FROM table WHERE int2>0 AND int2<101
как вариант?


они не по порядку... и не подойдет
Цитата
не совсем понял этот момент кода.

Цитата
GROUP BY `int2`

группируются и считаются совпавшие строки

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
McLotos
В смысле не по порядку? для запроса это не имеет значения. Или я что-то не так понял

_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
GET

SergeySA
Цитата
нет ли в таблице хотя-бы одного


_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
sergeiss
Цитата (ABC @ 8.07.2014 - 15:52)
нет ли в таблице хотя-бы одного

Первая проблема в том, что данная фраза воспринимается однозначно: ты хочешь определить, есть ли в таблице хотя бы один айди из списка. Да, "велИкая и могУчая рУсская язЫка" smile.gif

Только из дальнейшего диалога становится понятно, что тебе надо найти любой айди из указанного списка, чтобы он отсутствовал в таблице.

А по сути вопроса... Сейчас подумаю.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
GET
Цитата
Только из дальнейшего диалога становится понятно, что тебе надо найти любой айди из указанного списка, чтобы он отсутствовал в таблице.


точно smile.gif

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
GET
Хотел с NULL придумать, но не получается:


SELECT 1 FROM `tab` WHERE `int2` IN ('".implode("','",$val)."') AND `id` IS NULL LIMIT 1


не находит :(

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
McLotos
Т.е. надо проверить все ID и показать тот которого НЕТ в таблице?
Может тогда сделать проще?
Вытянуть все имеющиеся и дальше прото пробежаться по массиву и получить новый массив тех кого нету

_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
GET
Цитата
Т.е. надо проверить все ID и показать тот которого НЕТ в таблице?

не нужно показывать нужно просто узнать что нет хотя бы одного
Цитата
Может тогда сделать проще?
Вытянуть все имеющиеся и дальше прото пробежаться по массиву и получить новый массив тех кого нету

А если их миллиард?

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.