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

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
sergeiss
Вот так если....

1. Делаешь (один) запрос на получение списка всех строк с теми айди, что ты хочешь протестировать. Естественно, что будут выбраны только те, что имеются в таблице
select group_concat( id ) from your_table where id in (1, 3, 4)


2. Полученный результат (символьная строка) записываешь в переменную, которую "эксплодишь" в массив; пусть это будет $exist_list

3. Ранее созданный список тестовых значений загоняешь в другой массив, пусть это будет $test_list

4. Далее используешь функции работы с массивами, находишь ту, которая найдет тебе разницу между массивами $exist_list и $test_list.

В результате у тебя:
- один запрос к БД
- всего несколько строк кода в ПХП
- никаких явных циклов в ПХП


Цитата (ABC @ 8.07.2014 - 16:45)
А если их миллиард?

Их может быть сотня, судя по словам ТС, но не миллиард. То есть, по твоим же словам :)


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

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

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

user posted image
GET
sergeiss

Спасибо, но:

Если б int2 был уникальным, то примеру цены бы не было, элементов массива 100, а строк в которых они окажутся будет намного больше... и потом символьная строка от group_concat ограничена размерами, хотя думаю до этого не дойдет. Вместо того чтоб узнать есть ли одна строка я получаю, кучу строк с разбивкой и проверкой...протестю еще.

Спасибо.

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
sergeiss

PS. Но если их все-таки много, то можно сделать функцию в MySQL. Цикл внутри такой функции будет выполняться существенно быстрее, чем цикл в связке с ПХП.

PPS. А кстати - каков смысл поиска отсутствующих айди?

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

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

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

user posted image
GET
Нельзя ли сделать как-то так?

SELECT 1 FROM ('".implode("','",$val)."') AS `n` 
WHERE NOT EXISTS (SELECT 1 FROM `tab` WHERE `int`=`n` LIMIT 1)
LIMIT 1


_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
sergeiss
Подожди... Ты, случайно, не бреши в автоинкрементных полях собираешься искать?

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

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

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

user posted image
GET
Цитата
Подожди... Ты, случайно, не бреши в автоинкрементных полях собираешься искать?


Не..не..не

sergeiss
Можно ли в MySQL так как-то сделать?

SELECT * FROM (2,8,90) AS w


задать свой интервал данных - таблицу, чтоб реализовать это:
Цитата
SELECT 1 FROM ('".implode("','",$val)."') AS `n`
WHERE NOT EXISTS (SELECT 1 FROM `tab` WHERE `int`=`n` LIMIT 1)
LIMIT 1



_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
GET
Разобрался:

SELECT * FROM (SELECT 2,8,90) AS w

:)

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
GET
Осталось смиксовать два запроса

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
GET
SELECT * FROM (SELECT (900) AS `id`) AS `r`

Задаю таблицу с столбцом id с значением 900, как туда добавить еще 800?

SELECT * FROM (SELECT (802,900) AS `id`) AS `r`

ругается что должно быть 1 значение

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
sergeiss
Цитата (ABC @ 8.07.2014 - 17:59)
SELECT * FROM (SELECT 2,8,90) AS w

И что это тебе даст? Получишь ты набор колонок с цифрами, но не набор строк.

Тогда уж вот так:

select *
from
(
select 2 as id
union
select
8
union
select
90
) ini_sel


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

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

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

user posted image
GET
sergeiss
Цитата
И что это тебе даст? Получишь ты набор колонок с цифрами, но не набор строк.


вот так задаю столбец id только с одним значением, как остальные 2 туда запихнуть?

Цитата
SELECT * FROM (SELECT (900) AS `id`) AS `r`

Задаю таблицу с столбцом id с значением 900, как туда добавить еще 800?

SELECT * FROM (SELECT (802,900) AS `id`) AS `r`

ругается что должно быть 1 значение



_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
sergeiss
Цитата (ABC @ 8.07.2014 - 18:19)
как остальные 2 туда запихнуть?

Выше в "PS" ответил.

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

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

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

user posted image
GET
Цитата
Тогда уж вот так:

select *
from
(
select 2 as id
union
select 8
union
select 90
) ini_sel



Гм...спасибо.
$val=['SELECT 1 AS `id`','SELECT 3','SELECT 344']

SELECT 1 FROM ('".implode("'UNION'",$val)."') AS `n`
WHERE NOT EXISTS (SELECT 1 FROM `tab` WHERE `int`=`id` LIMIT 1)
LIMIT 1


sergeiss
Думаешь колхоз получился?

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
sergeiss
$val=['SELECT 1 AS `id`','3','344'];

implode ( ' UNION SELECT ', $val);


А вот сам запрос я не понял. Что там за "SELECT 1" в основном запросе?

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

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

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

user posted image
Быстрый ответ:

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