Помогите организовать SQL-запрос, никак не могу сообразить.

GoodLuck777

Новичок
Помогите организовать SQL-запрос, никак не могу сообразить.

Есть сайт: zakaz.sochiadm.ru, на нем в разделе запросы котировок есть "Рубрикатор продукции" - состоит из 12 000 записей. Моя задача была полностью скопировать сайт, для того чтобы скопировать все записи в рубрикаторе я написал скрипт и заносил их в базу. Не знаю как словами объяснить принцип рубрикатора, просто нужно глянуть, но идея такая: существует большой каталог, например "МАШИНЫ", в нем есть маленькие, например "Оборудование", "Станки", в этих маленьких есть еще свои подразделы, относится все по полю idpod которое определяет верхний каталог (может быть я неправильно спланировал базу данных?). Пример: 100000000 <- 110000000 <- 112000000 соответсвенно при клике на 110000000 мы увидим 112000000, 113000000 и т.д.
(всего 4 уровня от первого, не более)

Но проблема не в этом, а в том, что существуют так называемые котировки, в них можно включить несколько полей где указывается №продукта (последний номер, т.е. нельзя указать "МАШИНЫ", в нашем случае можно указать 112000000, 113000000). И исходя из этого надо сделать выборку из базы данных котировок "по рубрикатору" (на сайте который я указал в самом вверху "активные по рубрикатору") - и мы увидим такое:

100000000 МАШИНЫ (3 котировки)
200000000 ЖИЛЬЕ (2 котировки)
и т.д.

При клике на МАШИНЫ, открывается след. список:
110000000 бла-бла (1 котировка)
120000000 бла-бла (2 котировки)
и т.д.


Проблема в том, что я не могу организовать этот вывод, т.е. я например могу вывести просто весь рубрикатор, как как определить, что 3 котировки были в МАШИНАХ, ведь они не прямо были там указаны? В общем, кто меня понял - помогите плз.


Структура рубрикатора:

CREATE TABLE `rubrikator` (
`Id` int(6) unsigned NOT NULL auto_increment,
`Iden` int(4) NOT NULL default '0',
`name` tinytext NOT NULL,
`idpod` int(4) default '0',
`ssi` tinyint(4) default '0',
PRIMARY KEY (`Id`)
)

-~{}~ 03.10.06 10:39:

База данных - Mysql
 

Кром

Новичок
А ты до того как планировать базу данных, читал что нибудь про древовидное хранение данных?

>Проблема в том, что я не могу организовать этот вывод,

В чем конкретно проблема?

>что 3 котировки были в МАШИНАХ, ведь они не прямо были там указаны

Совершенно непонятно что ты хочешь сказать. Опиши подробно то место, в котором у тебя возникает проблема. В запросе к базе, в выводе из базы, в формировании html кода?
 

GoodLuck777

Новичок
У меня возникает проблема тогда, когда я пытаюсь организовать вывод всего этого дела. Я действительно не могу четко выразить свои мысли, но все должно работать также как на zakaz.sochiadm.ru, т.е. при запросе котировок нужно выводить сначала начальные данные рубрикатора, т.е. названия каталогов: ЖИЛЬЕ, МАШИНЫ, ОБОРУДОВАНИЕ, после чего нужно подсчитать сколько всего котировок содержится в каждой группе. Но дело в том, что отношения там:
100000000 <- 110000000 <- 112000000 <- 112100000

Фактически, в базе сохранена котировка с номером
112100000 и нужно от нее пройти путь до начала и понять, что она в составе ЖИЛЬЯ...

Не знаю как еще описать.. это можно посмотреть на том сайте, спасибо и извините если что не так. Ушел читать древовидное хранение данных.

-~{}~ 03.10.06 19:00:

Добавление, должно работать как: Запросы котировок -> котировки по рубрикатору
 

Кром

Новичок
>проблема тогда, когда я пытаюсь организовать вывод всего этого дела.
>112100000 и нужно от нее пройти путь до начала и понять, что она в составе ЖИЛЬЯ...

Ты разницу между запросом к базе и выводом из базы понимаешь или нет?

Если у тебя все таки проблема с sql запросом, то тут можно сделать несколько подготовительных вещей. Во-первых, судя по твой схеме:
100000000 <- 110000000 <- 112000000 <- 112100000
Заменяя ненулевую цифру справа на ноль, ты доберешся до корня. Т.е. ты уже в php можешь высчитать все родительские каталоги.
Другим запросом ты можешь выбрать все подразделы из основных разделов. Тут, видимо, тебе понадобиться что то типа SELECT COUNT(*) (BETWEEN 112100000 AND 112900000) AND ... и так далее для каждого родительского раздела.
 
Сверху