Гость
Форумы / MySQL [игнор отключен] [закрыт для гостей] / замена in (.....) / 25 сообщений из 29, страница 1 из 2
28.01.2020, 19:07
    #39919614
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
замена in (.....)
есть набор данных int,int ....
как можно заменить
selec * from xx where q in (int,int.....)
где этих int может быть много
вариант создать из int временную таблицу и выбрать через джоин
как можно сделать?*
...
Рейтинг: 0 / 0
28.01.2020, 20:37
    #39919648
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
замена in (.....)
Версия MySQL какая? Много - это сколько? порядок хотя бы...
...
Рейтинг: 0 / 0
28.01.2020, 21:10
    #39919655
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
замена in (.....)
Akina,
самая последняя.
1000++
вопрос более теоретический
...
Рейтинг: 0 / 0
28.01.2020, 23:13
    #39919695
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
замена in (.....)
Код: sql
1.
2.
3.
4.
5.
6.
SELECT t1.*
FROM table t1
NATURAL JOIN (VALUES ROW(1),
                     ROW(2),
                     -- ...,
                     ROW(1000)) t2 (q)
...
Рейтинг: 0 / 0
29.01.2020, 06:07
    #39919733
crutchmaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
замена in (.....)
вадя
вариант создать из int временную таблицу и выбрать через джоин

Вариант. Рядом же обсуждали.
https://www.sql.ru/forum/1321622-1/hibernate-repository-nativequery-peredat-massiv-kak-parametr-zaprosa
...
Рейтинг: 0 / 0
29.01.2020, 07:39
    #39919750
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
замена in (.....)
crutchmaster
Вариант.
Да дерьмовенький вариант-то. WHERE IN - это считай гарантированные тормоза, исключения крайне редки.
...
Рейтинг: 0 / 0
29.01.2020, 09:12
    #39919764
crutchmaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
замена in (.....)
Akina,

Да не where in, а join временной таблицы.
...
Рейтинг: 0 / 0
29.01.2020, 09:54
    #39919774
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
замена in (.....)
crutchmaster
Да не where in, а join временной таблицы.
вот созодание временной таблицы и хочется избежать...
...
Рейтинг: 0 / 0
29.01.2020, 10:05
    #39919782
crutchmaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
замена in (.....)
вадя,

А какие варианты? in - тормозной и не резиновый. В ракле через передачу clob'а, его парсинга и опять засовыванием его или в коллекцию.
...
Рейтинг: 0 / 0
29.01.2020, 10:14
    #39919789
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
замена in (.....)
crutchmaster
А какие варианты? in - тормозной и не резиновый.
Akina предожил
Akina
Код: sql
1.
2.
3.
4.
5.
6.
SELECT t1.*
FROM table t1
NATURAL JOIN (VALUES ROW(1),
                     ROW(2),
                     -- ...,
                     ROW(1000)) t2 (q)


вот только у меня не получается воспроизвести
...
Рейтинг: 0 / 0
29.01.2020, 10:17
    #39919791
crutchmaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
замена in (.....)
вадя,

Так это тоже самое, что засунуть всё в in. Список не резиновый. С другой стороны какой-нибудь пакетный вариант вставки в heap таблицу может быть вполне бодрым. Минус только в том, что надо на клиенте придумывать какие-то костыли, весь список не удастся взять и засунуть одним параметром.
...
Рейтинг: 0 / 0
29.01.2020, 10:36
    #39919801
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
замена in (.....)
crutchmaster
это тоже самое, что засунуть всё в in
Не совсем. Динамическая таблица такого размера с бОльшей вероятностью будет проиндексирована, чем список из IN.
...
Рейтинг: 0 / 0
29.01.2020, 10:37
    #39919802
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
замена in (.....)
вадя
созодание временной таблицы и хочется избежать...
Гм... а почему? самый ведь разумный вариант... да и все остальные фактически делают то же самое.
...
Рейтинг: 0 / 0
29.01.2020, 10:42
    #39919805
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
замена in (.....)
Akina
Гм... а почему? самый ведь разумный вариант... да и все остальные фактически делают то же самое.
время на создание таблицы и её заполнение

а твой вариант- это реальный?
в 8.0.17 не работает
...
Рейтинг: 0 / 0
29.01.2020, 11:03
    #39919815
crutchmaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
замена in (.....)
вадя
время на создание таблицы и её заполнение

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

"с вероятностью" - это не серьёзно. Мы разрабатываем предсказуемые информационные системы, а не в казино играем.
...
Рейтинг: 0 / 0
29.01.2020, 12:00
    #39919855
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
замена in (.....)
вадя
в 8.0.17 не работает
И в пятой версии не работает. И в четвёртой. А в последней? которая 8.0.19 - работает. А если в вопросе версия не указана - значит, у автора на этот счёт требований нет, а версия у него самая наисвежайшая.
...
Рейтинг: 0 / 0
29.01.2020, 12:01
    #39919856
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
замена in (.....)
crutchmaster
"с вероятностью" - это не серьёзно. Мы разрабатываем предсказуемые информационные системы, а не в казино играем.
Вот когда разработаем свой MySQL или хотя бы разберёмся в его исходнике, принимающем решение по этому моменту - тогда и будем знать точно. А пока только опытным путём... иногда индексирует, иногда нет, и вот хоть расшибись. В internals по этому поводу я ничего не видел.
...
Рейтинг: 0 / 0
29.01.2020, 12:03
    #39919857
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
замена in (.....)
Akina
А в последней? которая 8.0.19 - работает.
это что такое делается?какие скачки прогресса!
как отслеживать...
...
Рейтинг: 0 / 0
29.01.2020, 12:11
    #39919863
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
замена in (.....)
вадя
как отслеживать...
Не знаю... я просто глазами смотрю... поищи, мож у них ньюсы какие есть рассылочные.
...
Рейтинг: 0 / 0
29.01.2020, 12:16
    #39919869
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
замена in (.....)
вадя
Akina
А в последней? которая 8.0.19 - работает.
это что такое делается?какие скачки прогресса!
как отслеживать...

у mysql привычка в минорках фичи выкатывать. У них в целом творческий подход к нумерации, впрочем
...
Рейтинг: 0 / 0
29.01.2020, 12:28
    #39919880
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
замена in (.....)
Akina,

а как это работает?
Akina
Код: sql
1.
2.
3.
4.
5.
6.
SELECT t1.*
FROM table t1
NATURAL JOIN (VALUES ROW(1),
                     ROW(2),
                     -- ...,
                     ROW(1000)) t2 (q)

...
Рейтинг: 0 / 0
29.01.2020, 12:35
    #39919888
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
замена in (.....)
вадя
а как это работает?
Да как... формируем таблицу t2 с полем q и нужными значениями, связываем с ней источник, и надеемся, что сервер при построении плана проиндексирует эту динамическую таблицу. Точно так же можно было запихать этот список и в CTE - разница только в форме записи.
Код: sql
1.
2.
3.
4.
5.
6.
7.
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 килобайт...
...
Рейтинг: 0 / 0
29.01.2020, 17:12
    #39920094
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
замена in (.....)
вадя
есть набор данных int,int ....
как можно заменить
selec * from xx where q in (int,int.....)
где этих int может быть много
вариант создать из int временную таблицу и выбрать через джоин
как можно сделать?*
давно уже решили здесь FAQ: обработка строк и парсинг текстов средствами MySQL

Коротко и изящно
Вкратце
Код: sql
1.
2.
3.
4.
CREATE TABLE test.t1000 (
  id int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (id)
);

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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
...
Рейтинг: 0 / 0
29.01.2020, 17:40
    #39920119
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
замена in (.....)
кстати Вадя там был)
19136394
...
Рейтинг: 0 / 0
29.01.2020, 18:30
    #39920145
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
замена in (.....)
Alex_Ustinov,
это несколько не то
вот тут
VALUES ROW(1),
ROW(2),
-- ...,
ROW(1000)
хоть и написано что 1,2,.... 1000
это не означает что будет такое
это только частный случай
row(N), row(XX)....
что и подразумевает в данном случаем
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / замена in (.....) / 25 сообщений из 29, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]