Dimadima965, как уже заметили выше, задача, скорее всего, возникла по причине непонимания как пользоваться базой данных. И стоит ранить идентификаторы в специальной таблице связей а не в поле через разделитель. Тем не менее было уже предложено несколько решений, подкину и я. :)
Воспользуемся функцией
SUBSTRING_INDEX для решения . Так же понадобится последовательность чисел, чтобы "разбить" записи на строки, которые содержат лишь по одному id из ids. В качестве последовательности можно использовать специально созданную таблицу, с нужным количеством строк или же запрос вида:
SELECT 1 AS `n`
UNION SELECT 2 AS `n`
UNION SELECT 3 AS `n`
Последовательность должна содержать записей не меньше, чем идентификаторов в самой длинной строке ids.
В итоге из всего выше сказанного получим запрос вида:
SELECT
DISTINCT `items`.*
FROM (
SELECT 1 AS `n`
UNION SELECT 2 AS `n`
UNION SELECT 3 AS `n`
UNION SELECT 4 AS `n`
UNION SELECT 5 AS `n`
UNION SELECT 6 AS `n`
UNION SELECT 7 AS `n`
) AS `sequence`
INNER JOIN `items` ON CHAR_LENGTH(`items`.`ids`)-CHAR_LENGTH(REPLACE(`items`.`ids`, ',', ''))>=`sequence`.`n`-1
WHERE SUBSTRING_INDEX(SUBSTRING_INDEX(`items`.`ids`, ',', `sequence`.`n`), ',', -1) = 55
DISTINCT здесь нужен чтобы исключить повторяющиеся записи в результате, которые могут возникнуть в случае поиска по нескольким id. Чтобы искать по нескольким id, where будет таким:
WHERE SUBSTRING_INDEX(SUBSTRING_INDEX(`items`.`ids`, ',', `sequence`.`n`), ',', -1) IN (1, 10, 55)
Демка:
http://sqlfiddle.com/#!9/3acbd5/1