сложный запрос, replace(), IN()

berkut

Новичок
сложный запрос, replace(), IN()

приветствую. помогите разобраться с проблемкой:
Код:
CREATE TABLE `t1` (
  `id` smallint(6) unsigned NOT NULL default '0',
  `value` varchar(100) NOT NULL default ''
)

CREATE TABLE `t2` (
  `id` smallint(6) unsigned NOT NULL default '0',
  `t1_ids` varchar(100) NOT NULL default ''
)
поле t2.t1_ids содержит список значений t1.id, разделённые символом |
нормализовать базу не представляется возможным.
Нужно делать выборку t1.value, id которых перечисленны в t2.t1_idsсостряпал следующий запрос
Код:
SELECT t1.id, t1.`value` FROM t1, t2
WHERE t1.id IN (replace(t2.t1_ids, '|', ','))
и понял, что работать он небудет, т.к. replace() возвращает строку, а не набор значений. Подскажите, как можно решить эту задачу?
 

zerkms

TDD infected
Команда форума
факт: в 90% темы а-ля "... сложный запрос ..." перефразируются в "я сделал велосипед, научите меня на нём ездить"

а теперь по теме:
сделай ещё одну таблицу и через неё связывай t1 и t2. это называется отношением многих к многим
 

4m@t!c

Александр
идеальный вариант - это изменить структуру БД. Остальные варианты - это костыли. Будут очень большие потери по производительности, потому что нет явных полей для связи.
Тебе нужны функции поиска вхождения строки, типа FIND_IN_SET(), INSTR() и т.д.
 

berkut

Новичок
4m@t!c спасбо. производительность в данном случае не играет весомой роли. запрос вроде работает
Код:
SELECT t1.id, t1.`value` FROM t1, t2
WHERE
FIND_IN_SET(t1.id, replace(t2.t1_ids, '|', ',')) > 0
zerkms велосипед писал не я. есть готовая, кривая(сам не претендую на звание гуру), но очень большая работающая система. вот в неё нужно внести небольшие изменения. на то, чтобы нормализовать базу и внести соответствующие коррективы в скрипты потребуется недели 2 минимум, а что-бы решить вопрос меньшей кровью, потребовалось 2 дня
 
Сверху