Использование значения поля в SQL-операторе IN (...)

voituk

прозревший
Использование значения поля в SQL-операторе IN (...)

Есть таблица товаров и есть таблица наборов

В таблице наборов есть поле goods где через запятую записаны идентификаторы товаров.
Например "193,176,18"

Стоит задача выбрать все записи из таблицы товаров что относятся к конкретному набору.
Например при goods="193,176,18" получить записи из таблицы товаров для товаров 193,176 и 18
Сразу напрашивается что-то типа:
[sql]
SELECT good.* FROM good, sets
WHERE sets.id='2' AND good.id IN (sets.goods);
[/sql]

Но проблема возникает в том, что sets.goods это строковой литерал, а не последовательность чисел.
Потому IN ведет себя на нем очень неоднозначно.
Можно ли как-то преобразовать значение строкового поля, в список, для использования в операторе IN()
 

Кром

Новичок
Товары нужно писать не в строку, через запятую, а в столбец, в отдельной таблице.
Тогда IN будет вести себя абсолютно предсказуемо.
 

voituk

прозревший
Кром
Ну это уже к архитектуре относится, и мне понятно.
Но уже сделано именно так, а менять прийдется долго и мучительно.
 

Кром

Новичок
>а менять прийдется долго и мучительно.

Ты уже мучаешся, если ты еще не понял. :)
 

voituk

прозревший
Кром
Я все я прекрасно понимаю, но это как в анекдоте:

- Сколько вашему сорванцу?
- 16?! Дааа, аборт делать поздно
 

Кром

Новичок
>- Сколько вашему сорванцу?
>- 16?! Дааа, аборт делать поздно

Ну что тут сказать, "роди его обратно". :)
 

chira

Новичок
voituk
попробуй такую штуку
Код:
SELECT good . * 
FROM good, sets
WHERE sets.id = '2' AND 
FIND_IN_SET(good.id,sets.goods) > 0
но лучше будет переделать, как советует Кром.
 

voituk

прозревший
chira
Большое Спасибо! Именно то, что искал!

А переделывать как сказал Кром все-таки поздно :(.
Хотя можно будет на досуге попробовать переписать некоторые классы сущностей.
 
Сверху