Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сортировка строк из разных таблиц, в соответсвии с структурой NestedSets 
:(
    Опции темы
izOne
  Дата 5.5.2006, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



В упрощенном виде:

1-я таблица(t1 - objects)
Код

object_id | title | nestedsets_nid
1         | бб    | 9
2         | аa    | 5
3         | аб    | 6
4         | аa    | 4
5         | ба    | 9
6         | бб    | 8
7         | ба    | 7


2-я таблица(t2 - nestedsets)
Код

nestedsets_nid | nestedsets_leftid | nestedsets_rightid | nestedsets_level | nestedsets_treeid
1 (root)       | 1                 | 18                 | 1                | 1
2 (Украина)    | 2                 | 9                  | 2                | 1
3 (Россия)     | 10                | 17                 | 2                | 1
4 (Киев)       | 3                 | 4                  | 3                | 1
5 (Донецк)     | 5                 | 6                  | 3                | 1
6 (Львов)      | 7                 | 8                  | 3                | 1
7 (Москва)     | 11                | 12                 | 3                | 1
8 (Спб)        | 13                | 14                 | 3                | 1
9 (Челябинск)  | 15                | 16                 | 3                | 1



3-я таблица(t3 - i18n)
Код

table      | key_id | t10n
---------------------------
nestedsets | 1      | root
nestedsets | 2      | Украина
nestedsets | 3      | Россия
nestedsets | 4      | Киев
nestedsets | 5      | Донецк
nestedsets | 6      | Львов
nestedsets | 7      | Москва
nestedsets | 8      | СПб
nestedsets | 9      | Челябинск
-----------------------------


Задача сводиться к следующему:
1. получиться обьекты из таблицы 1
2. отсортировать их по title ASC, netstedsets_title ASC
netstedsets_title - перевод ветки дерева
-------------------------------------------------------------

В результате должна быть следующая таблица:
Код

oid | title | netstedsets_title
------------------------------------------
2   | аa    | Украина->Донецк
4   | аa    | Украина->Киев
3   | аб    | Украина->Львов
7   | ба    | Россия->Москва
5   | ба    | Россия->Челябинск
6   | бб    | Россия->Спб
1   | бб    | Россия->Челябинск


Как такое сделать? В наличии MySQL 4.1 
--------------------
Успех ждет каждого, но иногда всю жизнь.
PM Jabber   Вверх
Ignat
Дата 6.5.2006, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

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



Для глубины вложенности дерева = 2 и  с опущенным корнем, также если nestedsets.nestedset_nid целочисленное поле, то должно быть вроде:

Код
SELECT `t1`.`object_id` AS `oid`, `t1`.`title`, CONCAT (`t3b`.`t10n`, '->', `t3a`.`t10n`) AS `nestedsets_title`
FROM `objects` `t1`

INNER JOIN `nestedsets` `t2a` ON `t1`.`nestedsets_nid`=`t2a`.`nestedsets_nid`
INNER JOIN `i18n` `t3a` ON `t2a`.`nestedsets_nid`=`t3a`.`key_id` 

INNER JOIN `nestedsets` `t2b` ON `t2a`.`nestedsets_leftid` BETWEEN `t2b`.`nestedsets_leftid` AND `t2b`.`nestedsets_rightid`
INNER JOIN `i18n` `t3b` ON `t2b`.`nestedsets_nid`=`t3b`.`key_id`

WHERE `t3a`.`table`=`nestedsets` AND `t3b`.`table`=`nestedsets`
ORDER BY `t1`.`title` ASC , `nestedsets_title` ASC;


Не проверял, если что-то не так - пиши.

Добавлено @ 09:37 
ЗЫ. Строго на глаз, запрос не оптимальный, работать будет медленно.  


--------------------
Теперь при чем :P
PM   Вверх
izOne
Дата 10.5.2006, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Спасибо. Вот так заработало:
Код

SELECT 
  `t1`.`object_id` AS `oid`, 
  `t1`.`title` AS `title`, 
  `t3b`.`t10n` AS `ns3lev`, 
  `t3a`.`t10n` AS `ns2lev`,
  CONCAT_WS("->", `t3b`.`t10n`, `t3a`.`t10n`) AS `nestedsets_title`
FROM 
  `objects` AS `t1`
INNER JOIN `nestedsets` AS `t2a` ON (
  `t1`.`nestedsets_nid`=`t2a`.`nestedsets_nid`
)
INNER JOIN `i18n` AS `t3a` ON (
  `t2a`.`nestedsets_nid`=`t3a`.`key_id` 
     AND
  `t3a`.`table`="nestedsets"
)
INNER JOIN `nestedsets` AS `t2b` ON (
  `t2a`.`nestedsets_leftid` BETWEEN `t2b`.`nestedsets_leftid` AND `t2b`.`nestedsets_rightid`
    AND 
  `t2b`.`nestedsets_level`=`t2a`.`nestedsets_level`-1
    AND
  `t2b`.`nestedsets_level`>1
)
INNER JOIN `i18n` `t3b` ON (
  `t2b`.`nestedsets_nid`=`t3b`.`key_id`
    AND
  `t3b`.`table`="nestedsets"
)
ORDER BY 
  `t1`.`title` ASC,
  `nestedsets_title` ASC


но заточено под то, что:
1. дерево имеет 2 уровня(на приктике от 1 до 5 + не все ветки с 5-ю уровнями)
2. обьект привязан ко второму уровню[`objects`.`nestedsets_nid`](может быть привязан к любой ветке на любом уровне)

Возможно ли сделать этот запрос универсальным?  

Это сообщение отредактировал(а) izOne - 10.5.2006, 11:56
--------------------
Успех ждет каждого, но иногда всю жизнь.
PM Jabber   Вверх
Ignat
Дата 10.5.2006, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

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



izOne, подзапросами пойдёт?
Есть мыслишка, но еще не обмозговал. 


--------------------
Теперь при чем :P
PM   Вверх
izOne
Дата 10.5.2006, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Ignat, 
Конечно подойдет! 
--------------------
Успех ждет каждого, но иногда всю жизнь.
PM Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




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


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

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