Holips
Новичок
Вопрос с подвохом...
Есть таблица, которая хранит информацию о блюде и наборе его ингредиентов в виде строки чисел, разделённых запятой (например 1,5,22...)
Вопрос: как выбрать блюда, которые содержат ингредиенты 5,8 и не содержат ингредиенты 2,3
Пример простой, но в реальности таблица блюд "крупнее", да и запросы куда сложнее (могут содержать десяток ингредиентов).
Было бы весьма удобно сравнить строку в ячейке и строку с требуемыми ингредиентами - как массивы, то есть найти их пересечение.
Пробовал конструкцию WHERE IN "наоборот":
(эксперимент с треском провалился)
Вариант с проверкой по LIKE %% отпадает, так как порядок ингредиентов в блюде - достоверно не известен и может меняться. Да и лепить с пару десятков условий - не есть гуд.
Запасной вариант: выделить данные об ингредиентах блюд в отдельную таблицу, где каждый ингредиент будет столбцом tinyint(1). Это потребует выборку с подзапросом, что тоже не оптимально.
Вобщем, скажите, пожалуйста, как реализовать сравнение массивов на уровне мускула?
(если такое вообще возможно...)
Заранее благодарен за идеи, линки на хелп и любую полезную информацию.
Есть таблица, которая хранит информацию о блюде и наборе его ингредиентов в виде строки чисел, разделённых запятой (например 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). Это потребует выборку с подзапросом, что тоже не оптимально.
Вобщем, скажите, пожалуйста, как реализовать сравнение массивов на уровне мускула?
(если такое вообще возможно...)
Заранее благодарен за идеи, линки на хелп и любую полезную информацию.
Последнее редактирование: