[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Можно ли сделать такой запрос без цикла?
Страницы: 1, 2, 3
GET
Цитата
$val=['SELECT 1 AS `id`','3','344'];

implode ( ' UNION SELECT  ', $val);


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


А ну да...
ну как как думаешь? Как то все слишком сложно получилось...представил себе 100 значений через UNION SELECT это же какой запрос будет?

Ради чего... блин.

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

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

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
sergeiss
Мне кажется, что мой запрос с group_concat будет более правильным smile.gif

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

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

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

user posted image
GET
Цитата
Мне кажется, что мой запрос с group_concat будет более правильным


Ок, спасибо еще раз... smile.gif

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
Valick
"SELECT 1 FROM `tab` WHERE `int2` = ALL ('".implode("','",$val)."')"


_____________
Стимулятор ~yoomoney - 41001303250491
Zzepish
Никогда не пихай в циклы! Писал я как-то чат. Про джоины еще не знал, про ajax уже знал и практиковл. Так вот! одним запросом сообщеий и к ним цеплянием юзеров через цикл я положил базу с одного компа
sergeiss
Valick, так как из твоего запроса получить конкретные цифры тех айди, которые есть в списке, но которых нет в таблице?

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

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

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

user posted image
Valick
sergeiss, ну вопервых АВС надо только проверить все ли числа удовлетворяют условию и конкретные id ему не нужны.
А во вторых могу и id достать, а что есть сомнения?))
__
я кстати не знаю тот ли этот запрос, я никогда не применял ALL, и только что начал подозревать, что это не то что нужно
точно не то, да и с = этот ALL нельзя использовать))

_____________
Стимулятор ~yoomoney - 41001303250491
Valick
Цитата
Сделаю наверное циклом через php там есть вероятность, что отсутвуюшее значение будет угадано и тогда стоп...

я всё-таки знаю вариант решения задачи, на уровне СУРБД, и отсутсвующие номерки там тоже легко выдрать
просто пока хочу найти ещё какой-нибудь менее радикальный вариант

_____________
Стимулятор ~yoomoney - 41001303250491
sergeiss
Цитата (Valick @ 8.07.2014 - 20:29)
я всё-таки знаю вариант решения задачи, на уровне СУРБД

Я предложил вариант с функцией в MySQL, но он ТС почему-то не удовлетворил. Хотя это было бы наиболее правильным решением.

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

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

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

user posted image
GET
Valick Спасибо.

sergeiss
Valick
Zzepish

Даже стыдно как-то, короче обнаружил, что немного нарушена логика самого приложения в этом месте и правильнее делать запрос в еще одну таблицу и проверять наличие условия (`tab0`.`access`=1) прежде всего там, в итоге запрос такой (таблица tab немного другая, есть int1 - всегда константа для запроса через индекс):

SELECT 1 
FROM `tab0`
LEFT JOIN `tab` ON `int1`=38 AND `int2`=`tab0`.`id`
WHERE `tab0`.`id` IN (802,805,900)
AND `tab0`.`access`=1
AND `tab`.`id` IS NULL
LIMIT
1



Индексы: в tab0 - id(primary)//в таблице 2 000 строк
Индексы: в tab - int1+int2//в таблице 25 000 строк

Explain:
user posted image

C Not exists в extra раньше не встречался, но в целом, как я понял все неплохо.

О Not exists:
Свернутый текст

Not exists

MySQL was able to do a LEFT JOIN optimization on the query and does not examine more rows in this table for the previous row combination after it finds one row that matches the LEFT JOIN criteria. Here is an example of the type of query that can be optimized this way:

SELECT * FROM t1 LEFT JOIN t2 ON t1.id=t2.id
WHERE t2.id IS NULL;
Assume that t2.id is defined as NOT NULL. In this case, MySQL scans t1 and looks up the rows in t2 using the values of t1.id. If MySQL finds a matching row in t2, it knows that t2.id can never be NULL, and does not scan through the rest of the rows in t2 that have the same id value. In other words, for each row in t1, MySQL needs to do only a single lookup in t2, regardless of how many rows actually match in t2.


_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
sergeiss
Насчет решения твоей "начальной" задачи. Я вчера вечером пытался вспомнить, как я это делал ранее на Постгре и перевести в Мускуль. Почти доделал, но пришлось срочно уезжать по делам. Вот только недавно вернулся. Подумаю - напишу, как найти все эти пустоты. Существенно - без использования второй таблицы. Имеем единственную таблицу, в которой одним "16-этажным" (но на самом деле достаточно простым) запросом находим все пустоты по айди.

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

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

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

user posted image
GET
Цитата
Насчет решения твоей "начальной" задачи. Я вчера вечером пытался вспомнить, как я это делал ранее на Постгре и перевести в Мускуль. Почти доделал, но пришлось срочно уезжать по делам. Вот только недавно вернулся. Подумаю - напишу, как найти все эти пустоты. Существенно - без использования второй таблицы. Имеем единственную таблицу, в которой одним "16-этажным" (но на самом деле достаточно простым) запросом находим все пустоты по айди.


Ну...если у тебя будет время конечно. Я думаю будет очень интересно, задача наверное редкая, но необычная. БД все же заточены искать записи, а не их отсутствие. smile.gif

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
sergeiss
Вот, нашел "постгрешный" запрос :) Ничего не переделывал, взял, как он был ранее написан. enums - это тестовая таблица, содержащая единственное поле id.

with
ini_sel as
(
select e1.id as id1 , e1.id-1 as id_to, e2.id as id_from
from enums e1
full join
(select id+1 as id
from enums) e2
using( id )
where e1.id is null or e2.id is null
),
lost as
(
select * from
(
select id_to as id, 2::integer as bound from ini_sel
union
select
id_from, 1 from ini_sel
) sec_sel
where id is not null and id between (select min(id) from enums) and (select max(id) from enums)
)



select id_from, id_to,
case when id_from = id_to then
id_from::varchar
else
id_from || '-' || id_to
end as range

from
(
select id as id_from, (select id from lost where id>=ext_lost.id and bound=2 limit 1) as id_to
from lost ext_lost

where bound=1
) lost_list


Пример того, что он выдает:
id_from id_to range
3 3 3
10 11 10-11
13 14 13-14
16 23 16-23


Теперь сижу и пытаюсь выполнить свое обещание
Цитата (sergeiss @ 9.07.2014 - 14:44)
перевести в Мускуль


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

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

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

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

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