Запрос к MySQL с выводом в том порядке, в котором был ввод where
Как составить запрос, который делает вот что:
Есть таблица
col1 col2
1111 aaaa
1111 bbbb
2222 eeee
2222 xxxx
2222 aaaa
5555 yyyy
есть входящие рандомные данные, собранные в список от 0 до 1000 элементов:
list = dddd, yyee, hhhh, aaaa, ccnc, eeee,.... размер списка от 0 до 400 килобайт
list[0] = dddd
list[1] = yyee
...
запрос: select * from table where col2 in (здесь элементы списка строго по порядку: dddd, yyee, hhhh, aaaa, ccnc, eeee,....)
ответ: надо получить КОРТЕЖ, соответствующий порядку элементов в where.
например, запрос:
select * from table where col2 in (dddd, yyee, hhhh, aaaa, ccnc, eeee)
должен дать такой ответ:
uuuu = [ [none], [none], [none], [ [(1111)(aaaa)], [(2222),(aaaa)] ], [none], [(5555),(yyyy)] ]
где есть строгое соответствие элементов и результатов:
uuuu[0] = where[0] = dddd = list[0] = none
uuuu[1] = where[2] = yyee = list[1] = none
uuuu[2] = where[3] = hhhh = list[2] = none
uuuu[3] = where[3] = aaaa = list[3] = [ [(1111)(aaaa)], [(2222),(aaaa)] ]
uuuu[4] = where[4] = ccnc = list[4] = none
uuuu[5] = where[5] = eeee = list[5] = [(5555),(yyyy)]
другими словами, порядок элементов в where in (dddd, yyee, hhhh, aaaa, ccnc, eeee) соответствует порядку элементов в ответе от mysql
я думаю, можно реализовать с помощью переменных SQL на входе и на выходе
Ответы (1 шт):
Принципиально два решения - оба в общем плохие.
Первый - передать список дважды в виде единого CSV литерала и использовать в отборе и в сортировке.
SELECT *
FROM table
WHERE FIND_IN_SET(column, @CSV_list)
ORDER BY FIND_IN_SET(column, @CSV_list)
Второй - переданный литерал-список преобразовать в набор записей и использовать в запросе. Тут больше подойдёт не CSV, а JSON array.
SELECT table.*
FROM table
JOIN JSON_TABLE( @JSON_array_list,
'$[*]' COLUMNS ( sorting_order INT FOR ORDINALITY,
value VARCHAR(255) PATH '$' ) ) jsontable
ON table.column = jsontable.value
ORDER BY jsontable.sorting_order
Третье решение наилучшее. Список загрузить во временную таблицу, создать индекс по полю, и использовать в запросе.