Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / MySQL Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 замена in (.....)  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 17261
есть набор данных int,int ....
как можно заменить
selec * from xx where q in (int,int.....)
где этих int может быть много
вариант создать из int временную таблицу и выбрать через джоин
как можно сделать?*
28 янв 20, 19:07    [22068018]     Ответить | Цитировать Сообщить модератору
 Re: замена in (.....)  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19999
Версия MySQL какая? Много - это сколько? порядок хотя бы...
28 янв 20, 20:37    [22068082]     Ответить | Цитировать Сообщить модератору
 Re: замена in (.....)  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 17261
Akina,
самая последняя.
1000++
вопрос более теоретический
28 янв 20, 21:10    [22068091]     Ответить | Цитировать Сообщить модератору
 Re: замена in (.....)  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19999
SELECT t1.*
FROM table t1
NATURAL JOIN (VALUES ROW(1),
                     ROW(2),
                     -- ...,
                     ROW(1000)) t2 (q)
28 янв 20, 23:13    [22068162]     Ответить | Цитировать Сообщить модератору
 Re: замена in (.....)  [new]
crutchmaster
Member

Откуда: оттуда.
Сообщений: 813
вадя
вариант создать из int временную таблицу и выбрать через джоин

Вариант. Рядом же обсуждали.
https://www.sql.ru/forum/1321622-1/hibernate-repository-nativequery-peredat-massiv-kak-parametr-zaprosa
29 янв 20, 06:07    [22068264]     Ответить | Цитировать Сообщить модератору
 Re: замена in (.....)  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19999
crutchmaster
Вариант.
Да дерьмовенький вариант-то. WHERE IN - это считай гарантированные тормоза, исключения крайне редки.
29 янв 20, 07:39    [22068287]     Ответить | Цитировать Сообщить модератору
 Re: замена in (.....)  [new]
crutchmaster
Member

Откуда: оттуда.
Сообщений: 813
Akina,

Да не where in, а join временной таблицы.
29 янв 20, 09:12    [22068308]     Ответить | Цитировать Сообщить модератору
 Re: замена in (.....)  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 17261
crutchmaster
Да не where in, а join временной таблицы.
вот созодание временной таблицы и хочется избежать...
29 янв 20, 09:54    [22068326]     Ответить | Цитировать Сообщить модератору
 Re: замена in (.....)  [new]
crutchmaster
Member

Откуда: оттуда.
Сообщений: 813
вадя,

А какие варианты? in - тормозной и не резиновый. В ракле через передачу clob'а, его парсинга и опять засовыванием его или в коллекцию.

Сообщение было отредактировано: 29 янв 20, 10:11
29 янв 20, 10:05    [22068336]     Ответить | Цитировать Сообщить модератору
 Re: замена in (.....)  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 17261
crutchmaster
А какие варианты? in - тормозной и не резиновый.
Akina предожил
Akina
SELECT t1.*
FROM table t1
NATURAL JOIN (VALUES ROW(1),
                     ROW(2),
                     -- ...,
                     ROW(1000)) t2 (q)

вот только у меня не получается воспроизвести
29 янв 20, 10:14    [22068343]     Ответить | Цитировать Сообщить модератору
 Re: замена in (.....)  [new]
crutchmaster
Member

Откуда: оттуда.
Сообщений: 813
вадя,

Так это тоже самое, что засунуть всё в in. Список не резиновый. С другой стороны какой-нибудь пакетный вариант вставки в heap таблицу может быть вполне бодрым. Минус только в том, что надо на клиенте придумывать какие-то костыли, весь список не удастся взять и засунуть одним параметром.

Сообщение было отредактировано: 29 янв 20, 10:18
29 янв 20, 10:17    [22068345]     Ответить | Цитировать Сообщить модератору
 Re: замена in (.....)  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19999
crutchmaster
это тоже самое, что засунуть всё в in
Не совсем. Динамическая таблица такого размера с бОльшей вероятностью будет проиндексирована, чем список из IN.
29 янв 20, 10:36    [22068360]     Ответить | Цитировать Сообщить модератору
 Re: замена in (.....)  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19999
вадя
созодание временной таблицы и хочется избежать...
Гм... а почему? самый ведь разумный вариант... да и все остальные фактически делают то же самое.
29 янв 20, 10:37    [22068361]     Ответить | Цитировать Сообщить модератору
 Re: замена in (.....)  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 17261
Akina
Гм... а почему? самый ведь разумный вариант... да и все остальные фактически делают то же самое.
время на создание таблицы и её заполнение

а твой вариант- это реальный?
в 8.0.17 не работает
29 янв 20, 10:42    [22068365]     Ответить | Цитировать Сообщить модератору
 Re: замена in (.....)  [new]
crutchmaster
Member

Откуда: оттуда.
Сообщений: 813
вадя
время на создание таблицы и её заполнение

Какая-нибудь heap-таблица вполне быстрая.
Akina
Динамическая таблица такого размера с бОльшей вероятностью

"с вероятностью" - это не серьёзно. Мы разрабатываем предсказуемые информационные системы, а не в казино играем.
29 янв 20, 11:03    [22068385]     Ответить | Цитировать Сообщить модератору
 Re: замена in (.....)  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19999
вадя
в 8.0.17 не работает
И в пятой версии не работает. И в четвёртой. А в последней? которая 8.0.19 - работает. А если в вопросе версия не указана - значит, у автора на этот счёт требований нет, а версия у него самая наисвежайшая.
29 янв 20, 12:00    [22068473]     Ответить | Цитировать Сообщить модератору
 Re: замена in (.....)  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19999
crutchmaster
"с вероятностью" - это не серьёзно. Мы разрабатываем предсказуемые информационные системы, а не в казино играем.
Вот когда разработаем свой MySQL или хотя бы разберёмся в его исходнике, принимающем решение по этому моменту - тогда и будем знать точно. А пока только опытным путём... иногда индексирует, иногда нет, и вот хоть расшибись. В internals по этому поводу я ничего не видел.

Сообщение было отредактировано: 29 янв 20, 12:02
29 янв 20, 12:01    [22068476]     Ответить | Цитировать Сообщить модератору
 Re: замена in (.....)  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 17261
Akina
А в последней? которая 8.0.19 - работает.
это что такое делается?какие скачки прогресса!
как отслеживать...
29 янв 20, 12:03    [22068478]     Ответить | Цитировать Сообщить модератору
 Re: замена in (.....)  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19999
вадя
как отслеживать...
Не знаю... я просто глазами смотрю... поищи, мож у них ньюсы какие есть рассылочные.
29 янв 20, 12:11    [22068488]     Ответить | Цитировать Сообщить модератору
 Re: замена in (.....)  [new]
Melkij
Member

Откуда: Санкт-Петербург
Сообщений: 974
вадя
Akina
А в последней? которая 8.0.19 - работает.
это что такое делается?какие скачки прогресса!
как отслеживать...

у mysql привычка в минорках фичи выкатывать. У них в целом творческий подход к нумерации, впрочем
29 янв 20, 12:16    [22068496]     Ответить | Цитировать Сообщить модератору
 Re: замена in (.....)  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 17261
Akina,

а как это работает?
Akina
SELECT t1.*
FROM table t1
NATURAL JOIN (VALUES ROW(1),
                     ROW(2),
                     -- ...,
                     ROW(1000)) t2 (q)
29 янв 20, 12:28    [22068517]     Ответить | Цитировать Сообщить модератору
 Re: замена in (.....)  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19999
вадя
а как это работает?
Да как... формируем таблицу t2 с полем q и нужными значениями, связываем с ней источник, и надеемся, что сервер при построении плана проиндексирует эту динамическую таблицу. Точно так же можно было запихать этот список и в CTE - разница только в форме записи.
WITH t2 (q) AS ( VALUES ROW(1),
                        ROW(2),
                        -- ...,
                        ROW(1000) )
SELECT t1.*
FROM table t1
NATURAL JOIN t2

Можно было в CTE и набор SELECT 1 q UNION SELECT 2 UNION ... SELECT 1000 изобразить, но это лишние 8 килобайт...
29 янв 20, 12:35    [22068531]     Ответить | Цитировать Сообщить модератору
 Re: замена in (.....)  [new]
Alex_Ustinov
Member

Откуда: Nickel
Сообщений: 2955
вадя
есть набор данных int,int ....
как можно заменить
selec * from xx where q in (int,int.....)
где этих int может быть много
вариант создать из int временную таблицу и выбрать через джоин
как можно сделать?*
давно уже решили здесь FAQ: обработка строк и парсинг текстов средствами MySQL

Коротко и изящно
Вкратце
+
CREATE TABLE test.t1000 (
  id int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (id)
);
SELECT
    ttt.`id` AS `num`
    , SUBSTRING_INDEX(SUBSTRING_INDEX(par.a, ',', ttt.`id`), ',', -1) AS `word`
    , par.a AS source
  FROM t1000 AS ttt JOIN
  (SELECT '1,56,45,78,12,59,' AS a) AS par
  HAVING `word` <> ''
//*   t1000 вспомогательная таблица c автоинкрем. полем id 1..1000 - я такую держу в каждой базе
//*   SELECT * FROM t1000 это вместо 
//*   устаревшего "SELECT 1 as ID UNION ALL SELECT 2 ..."

одно только НО того что выше - в строке параметров необходимо добавить еще один разделитель, иначе будут повторения, и дополнительная работа. Ну если разделитель известен, то заКОНКАТить его недолго. Просто у меня в таком виде запомнено и иногда используется
Где то Javadbc выкатывал решение в общем виде, должно быть в FAQ
29 янв 20, 17:12    [22068872]     Ответить | Цитировать Сообщить модератору
 Re: замена in (.....)  [new]
Alex_Ustinov
Member

Откуда: Nickel
Сообщений: 2955
кстати Вадя там был)
19136394
29 янв 20, 17:40    [22068906]     Ответить | Цитировать Сообщить модератору
 Re: замена in (.....)  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 17261
Alex_Ustinov,
это несколько не то
вот тут
VALUES ROW(1),
ROW(2),
-- ...,
ROW(1000)
хоть и написано что 1,2,.... 1000
это не означает что будет такое
это только частный случай
row(N), row(XX)....
что и подразумевает в данном случаем
29 янв 20, 18:30    [22068952]     Ответить | Цитировать Сообщить модератору
 Re: замена in (.....)  [new]
Alex_Ustinov
Member

Откуда: Nickel
Сообщений: 2955
вадя,

я показал табл id 1..1000 просто для примера, можно больше, до 10000 это моя вспомогательная таблица
да согласен, новая фича удобная


для замены where in() запись новшества проще (ROW - это 1 столбец)
VALUES ROW(список в in)
29 янв 20, 23:17    [22069103]     Ответить | Цитировать Сообщить модератору
 Re: замена in (.....)  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 17261
Alex_Ustinov,

если есть ограничение в 10000 такая таблица, наверное , хорошее решение, да ещё если её в памяти строить (при старте mysql)
а вот когда максимальное число не известно...
29 янв 20, 23:26    [22069104]     Ответить | Цитировать Сообщить модератору
 Re: замена in (.....)  [new]
Alex_Ustinov
Member

Откуда: Nickel
Сообщений: 2955
вадя,

никто так не проектирует, чтобы в in() было тясячи параметров, десяток в IN() это уже странно
А таблицы t100 или t1000 или другая только для замены опорных таблиц типа (SELECT 1 as a UNION SELECT 2 UNION SELECT 3 ......),
кто-то делает селект к какой-нить таблице в информейшн_схема
29 янв 20, 23:38    [22069109]     Ответить | Цитировать Сообщить модератору
 Re: замена in (.....)  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 17261
Alex_Ustinov
десяток в IN() это уже странно
тут ведь не только количество важно , но и значение int или bigint.
а насчёт количества этих int - да, большое их количество - странно, но чем чёрт не шутит...
надо иметь варианты.

Сообщение было отредактировано: 29 янв 20, 23:51
29 янв 20, 23:49    [22069115]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / MySQL Ответить