Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как выбрать товары из текущей категории и подкатегорий?
 
 автор: Hamilion   (21.05.2008 в 18:49)   письмо автору
 
 

Нужно сделать одним запросом.
Есть две таблицы: таблица категорий и таблица товаров связанные между собой по ключу catid. Так же в таблице категорий некоторые записи связаны между собой по ключам catid и parent, т.е. в parent хранится значение ключа предка

-- 
-- Структура таблицы `cats`
-- 

CREATE TABLE `cats` (
  `catid` int(5) NOT NULL auto_increment,
  `parent` int(5) NOT NULL default '0',
  `name` varchar(10) NOT NULL default '',
  PRIMARY KEY  (`catid`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=7 ;

-- 
-- Дамп данных таблицы `cats`
-- 

INSERT INTO `cats` VALUES (1, 0, 'root');
INSERT INTO `cats` VALUES (2, 1, 'w');
INSERT INTO `cats` VALUES (3, 2, 'e');
INSERT INTO `cats` VALUES (4, 3, 'r');
INSERT INTO `cats` VALUES (5, 4, 't');
INSERT INTO `cats` VALUES (6, 4, 'y');

-- --------------------------------------------------------

-- 
-- Структура таблицы `prods`
-- 

CREATE TABLE `prods` (
  `prodid` int(5) NOT NULL auto_increment,
  `catid` int(5) NOT NULL default '0',
  `name` varchar(10) NOT NULL default '',
  PRIMARY KEY  (`prodid`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=7 ;

-- 
-- Дамп данных таблицы `prods`
-- 

INSERT INTO `prods` VALUES (1, 1, 'a');
INSERT INTO `prods` VALUES (2, 2, 's');
INSERT INTO `prods` VALUES (3, 3, 'd');
INSERT INTO `prods` VALUES (4, 4, 'f');
INSERT INTO `prods` VALUES (5, 5, 'g');
INSERT INTO `prods` VALUES (6, 6, 'h');

   
 
 автор: Trianon   (21.05.2008 в 18:52)   письмо автору
 
   для: Hamilion   (21.05.2008 в 18:49)
 

Одним запросом в выбранной схеме представления дерева - никак. Применяйте схему nested sets - она как раз для этого предназначена.

   
 
 автор: Hamilion   (22.05.2008 в 10:25)   письмо автору
 
   для: Trianon   (21.05.2008 в 18:52)
 

Ясно. А что, если заранее известна глубина вложенности, т.е. каталог будет выглядить Категория1->под-категория1->под-категория2->под-категория3
и товары будут храниться не глубже под-категория3 (у меня как раз так и сделано)? Реально ли одним запросом?

   
 
 автор: Trianon   (22.05.2008 в 11:18)   письмо автору
 
   для: Hamilion   (22.05.2008 в 10:25)
 

SELECT c0.name AS catname,  prods.*
  FROM cats as c3
  LEFT JOIN cats as c2 ON c2.catid = c3.catid OR c2.catid = c3.parent
  LEFT JOIN cats as c1 ON c1.catid = c2.catid OR c1.catid = c2.parent
  LEFT JOIN cats as c0 ON c0.catid = c1.catid OR c0.catid = c1.parent
  JOIN prods ON prods.catid = c0.catid
 WHERE c3.catid = $catid

как-то так...

   
 
 автор: Hamilion   (22.05.2008 в 12:33)   письмо автору
 
   для: Trianon   (22.05.2008 в 11:18)
 

Вот так работает.

   
 
 автор: Axxil   (22.05.2008 в 11:35)   письмо автору
 
   для: Trianon   (21.05.2008 в 18:52)
 

Ворос в тему.
Trianon, вам не встречалась удобная библиотека для работы конкретно с nested sets деревьями?

   
 
 автор: Trianon   (22.05.2008 в 11:54)   письмо автору
 
   для: Axxil   (22.05.2008 в 11:35)
 

Да я, собственно, не эксперт...

   
 
 автор: Hamilion   (22.05.2008 в 12:34)   письмо автору
 
   для: Axxil   (22.05.2008 в 11:35)
 

Нашел вот это http://php.russofile.ru/ru/authors/sql/nestedsets01, но не знаю насколько она удобная

   
 
 автор: Axxil   (22.05.2008 в 14:21)   письмо автору
 
   для: Hamilion   (22.05.2008 в 12:34)
 

Сенкс, посмотрим.

   
 
 автор: Anatoly_ua   (22.05.2008 в 13:16)   письмо автору
 
   для: Axxil   (22.05.2008 в 11:35)
 

Я работаю с PEAR DB_NestedSet
Есть практически все возможные операции с деревом: перемещение, копирование узлов, несколько вариантов вывода данных...
http://pear.php.net/manual/en/package.db_nestedset.php

   
 
 автор: Axxil   (22.05.2008 в 14:16)   письмо автору
 
   для: Anatoly_ua   (22.05.2008 в 13:16)
 

PEAR мне не нравится из-за ненужной громозкости библиотек. Для любого чиха там универсальных монстров пишут.
А с этим пакетом как? Не сильно громоздкий? (пока нет времени посмотреть, а то сам бы конечно разобрался)

> несколько вариантов вывода данных...
вот-вот ;-) зачем они нужны, эти несколько вариантов?

По сути для дерева надо 3 операции

Добавление узла/ветки
Удаление узла/ветки
Перемещение/копирование узла/ветки

   
 
 автор: Anatoly_ua   (22.05.2008 в 14:46)   письмо автору
 
   для: Axxil   (22.05.2008 в 14:16)
 

На самом деле все эти дополнительные возможности лежат в дополнительных файлах, т.е. если вы их не используете, то они и не грузятся. Единственное, что в качестве драйвера к БД ему нужен DB, MDB или MDB2, ну и все PEAR библиотеки используют PEAR класс (расширяют его). Но я не встречал еще класса для работы с nested sets, которые бы не использовали какой-нибудь внешний драйвер к БД

   
 
 автор: Axxil   (22.05.2008 в 17:33)   письмо автору
 
   для: Anatoly_ua   (22.05.2008 в 14:46)
 

Нашёл отличное решение.
http://blog.azazel.org.ua/2008/01/14/nested-sets/
Просто и ничего лишнего. Всё, что ещё может понадобится (если вообще понадобится) можно доделать самостоятельно. Легко понимается, изменяется, интегрируется куда угодно (за 20 минут воткнул в свой проект, где используется самописный драйвер баз).

Короче, надо брать :)

   
 
 автор: Hamilion   (26.05.2008 в 14:57)   письмо автору
 
   для: Trianon   (21.05.2008 в 18:52)
 

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

   
 
 автор: Trianon   (27.05.2008 в 01:29)   письмо автору
 
   для: Hamilion   (26.05.2008 в 14:57)
 

SELECT c0.name AS catname,  prods.* 
    FROM cats AS c1 
    LEFT JOIN  cats AS c0 ON c0.la >= c1.la AND c0.lb < c1.lb
    JOIN prods ON prods.catid = c0.catid
 WHERE c1.catid = $catid

как-то так...

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования