MySql - пересечение массива переменной и ячейке

Holips

Новичок
Вопрос с подвохом...

Есть таблица, которая хранит информацию о блюде и наборе его ингредиентов в виде строки чисел, разделённых запятой (например 1,5,22...)

Вопрос: как выбрать блюда, которые содержат ингредиенты 5,8 и не содержат ингредиенты 2,3

PHP:
CREATE TABLE IF NOT EXISTS `tbl1` (
  `food_id` int(11) NOT NULL AUTO_INCREMENT,
  `ingred` varchar(20) NOT NULL,
  PRIMARY KEY (`food_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;
PHP:
INSERT INTO `tbl1` (`food_id`, `ingred`) VALUES
(1, '1,5,6,8'),
(2, '4,5,7,8');
Пример простой, но в реальности таблица блюд "крупнее", да и запросы куда сложнее (могут содержать десяток ингредиентов).
Было бы весьма удобно сравнить строку в ячейке и строку с требуемыми ингредиентами - как массивы, то есть найти их пересечение.
Пробовал конструкцию WHERE IN "наоборот":
PHP:
SELECT * FROM `tbl1` WHERE (5,8) in ingred
(эксперимент с треском провалился)

Вариант с проверкой по LIKE %% отпадает, так как порядок ингредиентов в блюде - достоверно не известен и может меняться. Да и лепить с пару десятков условий - не есть гуд.

Запасной вариант: выделить данные об ингредиентах блюд в отдельную таблицу, где каждый ингредиент будет столбцом tinyint(1). Это потребует выборку с подзапросом, что тоже не оптимально.

Вобщем, скажите, пожалуйста, как реализовать сравнение массивов на уровне мускула?
(если такое вообще возможно...)

Заранее благодарен за идеи, линки на хелп и любую полезную информацию.
 
Последнее редактирование:

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Запасной вариант: выделить данные об ингредиентах блюд в отдельную таблицу, где каждый ингредиент будет столбцом tinyint(1). Это потребует выборку с подзапросом, что тоже не оптимально.
Делай "неоптимально".
 

Redjik

Джедай-мастер
1) Таблицу в innodb
2) связь MANY_MANY ингредиент блюдо
3) не забыть проставить FK

Как все сделаешь и попробуешь сделать выборки - приходи.

ЗЫ. гугл: Нормальная форма
 

Holips

Новичок
Видимо, всё же придётся реализовать "запасной вариант". Всем спасибо, тему можно закрывать.
 
Сверху