#mysql #sql
Вопрос:
Мне нужно выполнить запрос на выбор следующим образом:
select * from my_table where id NOT IN (comma_delimited_string);
Каков правильный способ достижения этой цели?
Учитывая тот факт, что я контролирую клиентский код, который отправляет строку, есть ли лучший подход? (строка будет содержать примерно 30 идентификаторов, поэтому я пытаюсь избежать отправки 30 параметров, по одному для каждого идентификатора).
Спасибо вам всем
Комментарии:
1. Что плохого в отправке 30 параметров? Вы должны быть в состоянии написать некоторый код для построения запроса, чтобы упростить его.
2. Создает ли клиентский код строку или он создает запрос и отправляет запрос?
3. @GordonLinoff он создает строку и отправляет ее в хранимую процедуру.
Ответ №1:
Вы можете использовать функцию MySQL FIND_IN_SET
:
SELECT *
FROM my_table
WHERE FIND_IN_SET(id, comma_delimited_string) = 0
Дополнение: Обратите внимание, что приведенный выше запрос не поддается оптимизации, поэтому, если у вас есть индекс в id
MySQL, не используйте его. Вам придется решить, стоит ли относительная простота использования FIND_IN_SET
потенциального снижения производительности (я говорю «потенциал», потому что не знаю, id
индексируется ли ваша таблица или достаточно велика, чтобы это вызывало беспокойство).
Комментарии:
1. Хотя я не думаю
FIND_IN_SET
, что могу использовать индексы.2. Определенно нет, и это хорошее замечание. Я обновлю ответ, чтобы предупредить ОП о том, что запрос будет неоптимизируемым. Они сами решат, является ли это проблемой.
3. Идентификатор @EdGibbs индексируется. Таблица состоит из ~3500 записей.
4. @UdiI при 3500 записях я, честно говоря, не стал бы слишком беспокоиться об оптимизации, особенно с
NOT IN
запросом. Я бы ожидал, что он заработает меньше чем за секунду. Тем не менее, я бы все равно немного протестировал его, чтобы убедиться, что скорость приемлема.5. Существует ли ограничение (длина) для
comma_delimited_string
? Это продиктованоVARCHAR
илиgroup_concat_max_len
?