2013-06-07 2 views
9

Мне нужно выполнить запрос на выборку следующим образом:MySql выбрать в пункте строку через запятую

select * from my_table where id NOT IN (comma_delimited_string); 

Что такое правильный путь для достижения этой цели?

Учитывая, что я контролирую клиентский код, который отправляет строку, есть ли лучший подход? (строка будет содержать приблизительно 30 идентификаторов, поэтому я пытаюсь избежать отправки 30 параметров, по одному для каждого идентификатора).

Спасибо всем

+0

Что не так с отправкой 30 параметров? Вы должны иметь возможность написать код для создания запроса, чтобы сделать его проще. –

+1

Является ли код клиента строкой строки или строит запрос и отправляет запрос? –

+0

@GordonLinoff строит строку и отправляет ее в хранимую процедуру. –

ответ

16

Вы можете использовать функцию 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' может использовать индексы. –

+1

Определенно нет, и хорошая точка. Я обновлю ответ, чтобы предупредить OP о том, что запрос будет не оптимизирован. Им решать, решать ли это проблемы. –

+0

@EdGibbs id индексируется. Таблица состоит из ~ 3500 записей. –

Смежные вопросы