Mysql SQL IN (подзапрос)

shkarbatov

Новичок
Добрый вечер.

Подскажите пожалуйста, есть БД интернет магазина (пока только проектируется).

-- Структура БД
PHP:
CREATE TABLE IF NOT EXISTS `categories` (
  `id` mediumint(8) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `name` varchar(255) NOT NULL COMMENT 'Имя',
  `parent_id` mediumint(8) NOT NULL COMMENT 'ID родительской категории',
  `mpath` varchar(128) NOT NULL COMMENT 'Материальный путь',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- Тестовые данные таблицы `categories`
PHP:
INSERT INTO `categories` (`id`, `name`, `parent_id`, `mpath`) VALUES
(1, 'Category 1', 0, ''),
(2, 'Category 2', 1, '1'),
(3, 'Category 2', 1, '1'),
(4, 'Category 1', 0, ''),
(5, 'Category 3', 3, '1,3'),
(6, 'Category 4', 7, '1,2,7'),
(7, 'Category 3', 2, '1,2');
Мне необходимо выбрать все родительские категории заданной категории (допустим 6).
То есть в итоге должны выбраться категории с id = (1, 2, 7)/

Есть вот такой вот запрос:
PHP:
SELECT id
FROM categories
WHERE id IN (
	SELECT mpath
	FROM categories
	WHERE id = 6
)
По идее все хорошо, вот только проблема в том, что подзапрос возвращает ('1, 2, 7'), а не (1, 2, 7) и выбирается соответственно только 1 директория.

Вопрос: Подскажите пожалуйста как лучше решить эту ситуацию. Если есть действенные советы по перепроектированию БД, то можно их рассмотреть. Однако желательно решить текущую задачу с исходными данными.

Всем спасибо!
 

Фанат

oncle terrible
Команда форума
нет. текущими её не решать нежелательно.
Родителей получай рекурсией.
 

shkarbatov

Новичок
Думаю, что рекурсией - это очень плохой вариант.

Какие есть варианты по перепроектированию? Возможно стоит построить mpath по какой-то другой схеме?
 

shkarbatov

Новичок
Можно пример пожалуйста?

Просто глубина, думаю вы поняли, будет разного рода, есть максимальное ограничение, но не минимальное?
 

Фанат

oncle terrible
Команда форума
Да какой там пример-то?
В цикле выполняется запрос, который по id получает родителя.
 

shkarbatov

Новичок
Прикол в том, что бы сделать это на sql.
На php можно просто разобрать mpath на id и сделать второй запрос на выборку этих id

Но мне надо именно средствами sql
 

shkarbatov

Новичок
Я прошу у вас совета, если я говорю, что мне так надо, значит есть на то необходимость.
Если я не говорю, по чему. Значит на то есть свои причины.
 

Фанат

oncle terrible
Команда форума
Чтобы дать совет, надо видеть полную картину.

А играть в конспирашки - это, пожалуйста, не здесь
 

shkarbatov

Новичок
Исходные данные все есть, любопытство, вот что здесь присутствует.
Ну да ладно, моя просьба о помощи и совете вас ни к чему не обязывает.
 

Фанат

oncle terrible
Команда форума
Исходных данных у тебя нет. У тебя есть исходный винегрет.
приведи сначала базу в нормальную форму, а потом уже говори, что у тебя есть данные
 

fixxxer

К.О.
Партнер клуба
shkarbatov
два запроса, первым выбираешь mpath, вторым запрос where in($mpath)
 

SiZE

Новичок
shkarbatov, тебе не надо получать все данные в одном SQL запросе. Сделай метод на РНР, который тебе будет их возвращать. В противном случае все равно придется писать аналогичную функцию, только на SQL. Но смысла в этом никакого. В SQL надо стараться выносить контроль целостности данных.

varchar(128) 0_o, чем человеку char не угодил...
char и varchar по разному хранятся в MySQL. Подробнее в учебнике. Последний предпочтительней на мой взгляд.
 
Сверху