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

shkarbatov
Дата: 16.12.2012 20:24:38
Добрый вечер.

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

-- Структура БД
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`
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)/

Есть вот такой вот запрос:

SELECT id
FROM categories
WHERE id IN (
    SELECT mpath
    FROM categories
    WHERE id = 6
)

По идее все хорошо, вот только проблема в том, что подзапрос возвращает ('1, 2, 7'), а не (1, 2, 7) и выбирается соответственно только 1 директория.

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

Всем спасибо!
javajdbc
Дата: 16.12.2012 23:31:22
shkarbatov,

Запрос выполняется 25 сек

Цитата по ссылке:

автор
.......Ето плохой дезайн, не делайте так. Дальнейшее обсуждение расчитано
только на вариант когда такой плохой дезайн уже есть и исправить нельзя....


Недавно было ОЧЕНЬ интересное обсуждание иерархических
запросов в МуСКЛ по результатам експериментов автора bochkov.
Поишите по имени автора и вообше поиск по (как там правильно пишется
это слово?) "иерархические запросы" вам подксажет как изменить структуру.
qwerty112
Дата: 16.12.2012 23:58:29
shkarbatov
-- Тестовые данные таблицы `categories`
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)

это (выделил) - опечатка ?
---
с mpath, имхо, "не докрутили" вы,
туда нужно ещё и ИД самого узла "пихать" - тогда очень всё (поиск перентов/чайлдов) просто будет - 1
ошибок, как то, что я выделил - не будет в принципе - 2

типа такого
SELECT id
FROM categories a,
(select mpath from categories where id=6) b
where b.mpath like concat(a.mpath,'%')
and b.mpath<>a.mpath
qwerty112
Дата: 17.12.2012 00:04:12
qwerty112
это (выделил) - опечатка ?

ага, понял,
это не ошибка - это то, что я про "недокрученный" mpath написал ...

--
вот так, если измените формирование mpath - усё моментально становится просто ! :)
INSERT INTO `categories` (`id`, `name`, `parent_id`, `mpath`) VALUES
(1, 'Category 1', 0, '1'),
(2, 'Category 2', 1, '1,2'),
(3, 'Category 2', 1, '1,3'),
(4, 'Category 1', 0, '4'),
(5, 'Category 3', 3, '1,3,5'),
(6, 'Category 4', 7, '1,2,7,6'),
(7, 'Category 3', 2, '1,2,7');
Akina
Дата: 17.12.2012 00:05:06
qwerty112
это (выделил) - опечатка ?
Думаю, нет...
Вот потому и думаю - советовать nested set или нет...