Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Дерево из нескольких таблиц 
V
    Опции темы
CODARZ
Дата 6.8.2007, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 3.10.2003
Где: Москва

Репутация: нет
Всего: нет



Есть несколько таблиц с категориями и подкатегориями товаров series, type, power. 
В каждой таблице всего два поля id, name

| id | name                     |
  1    Бытовые   2    Промышленные

и отдельная таблица со всеми перечисленными моделями со всеми идентификаторами (ссылками)  на каждую таблицу с соответствующими именами Series, Type, Power (по идее должны быть 0,1,2 - по уровню вложенности...)

| id     | name             | Series | Type  | Power |
  924    CDS-1239Z       4           7         4         

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

Пробовал такой способ 

вывести данные одним запросом через JOIN типа 

Код

SELECT series.Id as SeriesId, type.Id as TypeId, type.name as TypeName, 
inverter.Id as InvId, inverter.name as InvName, refrigerant.Id as RefId, 
refrigerant.name as RefName, models.IdModel as IdModel, models.name as ModelName 
FROM models INNER JOIN series, type, inverter, refrigerant ON series.Id = models.series AND type.Id = models.type AND inverter.Id = models.inverter AND refrigerant.Id = models.refrigerant


затем превращал в Materialized Path таким образом

Код

//для построения Matherialized Path
$testcat = $row['SeriesId'].".".$row['TypeId'].".".$row['InvId'].".".$row['RefId'].".".$row['IdModel'];

// для определения уровня вложенности
$catcount = strlen(preg_replace("/\d/i","",$testcat));
echo " [".$catcount."] ".$testcat."<br>";


На выводе вот так выходит:


Код

[4] 1.1.1.3.1426
[4] 1.1.1.3.1098
[4] 1.1.1.3.1427
[4] 1.1.1.3.1099
[4] 1.1.1.3.1100
[4] 1.1.1.3.1101



Может можно хотя бы как то свести до подобной структуры?

1
1.1
1.2.3
1.2.7...

Или вообще возможен другой способ? Я в ступоре уже опробовал многие методы, но базу менять нельзя :(

Это сообщение отредактировал(а) CODARZ - 8.8.2007, 09:47
PM MAIL WWW ICQ   Вверх
CODARZ
Дата 8.8.2007, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 3.10.2003
Где: Москва

Репутация: нет
Всего: нет



Для потомков smile
Проблема решена таким запросом

Код

function get_ctgs_tree() 
{
    global $hConn;
    $query = "SELECT s.name AS s_name, m.series AS m_series, t.name AS t_name, m.type AS m_type, i.name AS i_name, m.inverter AS m_inv, r.name AS r_name, m.refrigerant AS m_ref FROM models AS m LEFT JOIN series AS s ON (s.id = m.series) LEFT JOIN type AS t ON (t.id = m.type) LEFT JOIN inverter AS i ON (i.id = m.inverter) LEFT JOIN refrigerant AS r ON (r.id = m.refrigerant) GROUP BY s.id, t.id, i.id, r.id ORDER BY s.id ASC, t.id ASC, i.id ASC, r.id ASC";
    $res = mysql_query( $query);
    $ctg = array(); 
    while ($row = mysql_fetch_array($res))
    {
        $ctg[] = $row;
    }
    return $ctg;
}


И проходом по массиву...

Код

foreach ($categories as $ctg)
{
...
echo $ctg['s_name']
}


Чтобы определить степень вложенности категории, просто проверяем условия для каждой категории и выводим в соответствии с правилами для каждой (уровень вложенности, отступ от края, плюсик или минусик...) smile

Код

//  исключаем повторы, т.к. в результате вышеприведенного запроса к базе
//  в массив попадают все поля во всех комбинациях
if (($ctg['m_series'] != $prev_series) && ($ctg['s_name'] != NULL))
{
...
//это чтобы исключить повторения
$prev_series = $ctg['m_series'];
}


Довольно замудренно, но после многих часов издевательства ничего лучшего, более быстрого и рабочего придумать не смог..может у кого ещё были варианты? smile


Это сообщение отредактировал(а) CODARZ - 8.8.2007, 09:53
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.0628 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.