![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 367 Pomógł: 10 Dołączył: 20.05.2005 Ostrzeżenie: (0%) ![]() ![]() |
Stworzyłem swój system drzewek za pomocą metody "IP".
Polega na tym że w TREE znajduje się mapa zagnieżdzenia (id rodzielone kropką). Dodatkowo stosuje dopełnianie zerami, w celu utrzymania kolejności zagnieżdzenia (prawidłowe sortowanie liczb, które są łańcuchem znaków a nie typem INT). 10 cyfrowa liczba ponieważ ID (INTEGER) może mieć największą wartość równą 4 294 967 295. Przy polu tree o długości 255 znaków możliwe jest utworzenie 23 poziomów. Jeśli pole będzie typu TEXT będzie napewno o wiele więcej. Tabela: Kod +-----------+-------------------+------+-----+------------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------------+------+-----+------------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | parent_id | int(10) | NO | | 0 | | | tree | varchar(255) | NO | | 0000000000 | | | depth | int(100) unsigned | NO | | 0 | | | name | varchar(255) | NO | | NULL | | | position | int(10) unsigned | NO | | 0 | | +-----------+-------------------+------+-----+------------+----------------+ 6 rows in set (0,00 sec) Tworzymy tabelę
Dodajemy dane
Wyświetlenie drzewka:
Wynik: Kod +----+-----------+----------------------------------+-------+---------------+----------+ | id | parent_id | tree | depth | name | position | +----+-----------+----------------------------------+-------+---------------+----------+ | 1 | 0 | 0000000000 | 0 | Tomek | 2 | | 7 | 1 | 0000000000.0000000001 | 1 | Pod kategoria | 0 | | 2 | 0 | 0000000000 | 0 | Jacek | 1 | | 3 | 2 | 0000000000.0000000002 | 1 | Placek | 2 | | 4 | 2 | 0000000000.0000000002 | 1 | Gacek | 3 | | 5 | 2 | 0000000000.0000000002 | 1 | Kowalski | 1 | | 6 | 5 | 0000000000.0000000002.0000000005 | 2 | Nowak | 1 | +----+-----------+----------------------------------+-------+---------------+----------+ Wszystko ładnie się wyświetla w odpowiednim porządku, ponieważ stosuje dopełnianie z lewej strony zerami. Ale to czego potrzebuje to posortować te wyniki dodatkowo według pozycji (position). Na tym etapie trzeba wprowadzić warunek: sortowane mają być wiersze według pola position które mają taki sam parent_id. Czyli najpierw sortowane są względem struktury drzewiastej a teraz tam gdzie parent_id jest wspólny chce dodatkowo posortować według pola position. Napewno trzeb będzie zrobić SELECTA z SELECTA, ale nie wiem jak do tego postawić warunek że mają się sortować według pola position tylko te pola które mają ten sam parent_id.
Ewentualnie w jaki sposób napisać do tego procedurę która te dane posortuje? EDIT Po przeprowadzaniu wielokrotnych testów nie udało mi się tym sposobem znaleźć rozwiązania. Podaje linki do lepszego rozwiązania problemu struktury drzewiastej http://www.eioba.pl/a130/drzewa_w_php_i_mysql http://www.artfulsoftware.com/mysqlbook/sa...sqled1ch20.html Ten post edytował eai 18.02.2009, 14:32:10 |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 40 Pomógł: 4 Dołączył: 6.11.2008 Skąd: Bytom Ostrzeżenie: (0%) ![]() ![]() |
A nie wystarczy
swoją drogą nie wiem po co Ci pole tree - skoro masz parent_id to wystarczy żeby wyciągnąć potrzebe Ci dane -------------------- Dysortografik -> nie besztać za błędy ;P
pomogłem ? -> kliknij "pomógł" ;) |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 367 Pomógł: 10 Dołączył: 20.05.2005 Ostrzeżenie: (0%) ![]() ![]() |
Założenia są takie:
- bez rekursywności - zwrócone dane mają być posortowane według: a) struktry drzewa (rodzic, dziecko) ![]() O to kilka przykładów wyników: Posortowane według struktry drzewa (rodzic, dziecko)
Kod +-----------------+ | name | +-----------------+ | Tomek | | Pod kategoria | | Jacek | | Placek | | Gacek | | Kowalski | | Nowak | +-----------------+ 7 rows in set (0,00 sec) Wszystko jest ok poza tym że nie są dodatkowo posortowane według pozycji (pole position) Propozycja tomka
Kod +-------------------+----------+ | name | position | +-------------------+----------+ | Tomek | 2 | | Pod kategoria | 0 | | Jacek | 1 | | Placek | 55 | | Gacek | 45 | | Kowalski | 180 | | Nowak | 1 | +-------------------+----------+ 7 rows in set (0,00 sec) Jak widać nie przynosi to pożądanego efektu. Propozycja mojego kolegi
Kod +-------------------+----------+ | name | position | +-------------------+----------+ | Jacek | 1 | | Tomek | 2 | | Pod kategoria | 0 | | Gacek | 45 | | Placek | 55 | | Kowalski | 180 | | Nowak | 1 | +-------------------+----------+ 7 rows in set (0,00 sec) Jak widać wszystko się rozsypało. Druga propozycja tego samego kolegi
Kod +-------------------+----------+ | name | position | +-------------------+----------+ | Jacek | 1 | | Pod kategoria | 0 | | Tomek | 2 | | Nowak | 1 | | Gacek | 45 | | Placek | 55 | | Kowalski | 180 | +-------------------+----------+ 7 rows in set (0,00 sec) Jak widać również nieskuteczna. Padło pytanie dlaczego dopełniam zerami tree? Ponieważ jest typu VARCHAR czyli string, a to znaczy że nie jest liczbą i sortowanie przynosi zupełnie inny efekt. Pole typu INT posortuje liczby 1,11,2,21,33 w kolejności 1,2,11,21,33 natomiast pole typu VARCHAR te same liczby posortuje w kolejności 1,11,2,21,33 co jest logiczne bo traktuje je jako łańcuch znaków a nie liczbę. Mam nadzieję że troche wam wyjaśniłem. Próbuje napisać do tego procedurę która będzie mi tylko sortowała wyniki z mojego pierwszego zapytania. Ale jak narazie bezskutecznie. Ten post edytował eai 18.11.2008, 09:01:04 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 22.08.2025 - 06:07 |