MySQL выберите В предложении строку, разделенную запятыми

#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 ?