Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> pobieranie danych drzewa
AcidBurnt
post 12.01.2006, 15:51:49
Post #1





Grupa: Zarejestrowani
Postów: 215
Pomógł: 1
Dołączył: 13.04.2003
Skąd: z ławki przed blokiem

Ostrzeżenie: (0%)
-----


witam,

mam Sobie baze danych użytkowników, kazdy uzytkownik ma swojego rodzica, nie ma ograniczenia glebokosci drzewa.

w bazie

user_id | user_parent, gdzie user_paretnt to user_id rodzica.

no i zaszła potrzeba wyswietlenia tego drzewka, i dziala to w tej chwili tak:

  1. <?php
  2. function get_child($user_id){
  3. global $db;
  4. $tree = array();
  5. $row = $db -> Execute("SELECT user_name,user_surname,user_id,user_level FROM temida_users WHERE us
    er_parent = '"
    .$user_id."' ORDER BY user_surname");
  6. foreach($row -> GetRows() as $cos){
  7. $cos[user_childs] = get_child($cos["user_id"]);
  8. array_push($tree, $cos);
  9. }
  10.  
  11. return $tree;
  12. }
  13. function get_tree($user_id){
  14. global $db;
  15. $tree = $db -> Execute("SELECT user_name,user_surname,user_id,user_level FROM temida_users WHERE us
    er_id = '"
    .$user_id."' ORDER BY user_surname");
  16. $tree = $tree -> GetRows();
  17. $tree = $tree[0];
  18. $tree[user_childs] = array();
  19. $tree[user_childs] = get_child($user_id);
  20. return $tree;
  21. }
  22. ?>


tzn konkretnie sa to funkcje pobierania drzewa, w tej chwili gdy w bazie jest okolo 300 userow nie ma problemu z pobraniem tego, no ale juz przy 10000 pojawia sie problem ;/

ma ktoś jakiś pomysł jak zmyslnie wyświetlać takie drzewko? moze jakos inaczej zapisywac dane albo cos....
Go to the top of the page
+Quote Post
NuLL
post 12.01.2006, 15:53:32
Post #2





Grupa: Zarejestrowani
Postów: 2 262
Pomógł: 21
Dołączył: 3.05.2004
Skąd: Sopot, Krakow, W-wa

Ostrzeżenie: (0%)
-----


Na wortalu jest artykul o drzewkach. Rowniez www.depesz.com


--------------------
Javascript, Coffeescript, Node.js, Mongo, CouchDb, chmury, workery & inne bajery - zycie jest zbyt krotkie aby miec nudna prace :)
Go to the top of the page
+Quote Post
bigZbig
post 12.01.2006, 15:58:56
Post #3





Grupa: Zarejestrowani
Postów: 740
Pomógł: 15
Dołączył: 23.08.2004
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Na tym forum problem drzew pojawial sie juz wiele razy. Jest kilka koncepcji drzew sqlowych np. - wspomniane już - drzewo depesza, nested sets(zbiory zagniezdzone), drzewa IP.


--------------------
bigZbig (Zbigniew Heintze) | blog.heintze.pl
Go to the top of the page
+Quote Post
ActivePlayer
post 12.01.2006, 17:28:48
Post #4





Grupa: Przyjaciele php.pl
Postów: 1 224
Pomógł: 40
Dołączył: 6.07.2004
Skąd: Wuppertal

Ostrzeżenie: (0%)
-----


tak na szybko, bo zapewne nie bedzie Ci sie chcialo calosci przerabiac. albo cachuj wyniki tego co zwracaja te funckje, albo pobierz jednorazowo calosc, i potem tylko obrabiaj phpem
Go to the top of the page
+Quote Post
AcidBurnt
post 17.01.2006, 00:38:28
Post #5





Grupa: Zarejestrowani
Postów: 215
Pomógł: 1
Dołączył: 13.04.2003
Skąd: z ławki przed blokiem

Ostrzeżenie: (0%)
-----


więc tak zaimplementowałem tą metode:

http://www.depesz.com/various-sqltrees-implementation.php

no i teraz pojawił sie problem, wszystkie triggerki napisane są dla pobierania całego drzewka od razu (co przy 10k userów i tak sie wywala i tak), no ale teraz jak ograniczyć to pobieranie do 5 poziomów w głąb, i pobierac dane dla konkretnego usera?

probowałem cos podziałac na zapytaniu:

  1. SELECT
  2. k.*,
  3. p.*
  4. FROM kategorie k JOIN powiazania p ON k.id = p.child_id
  5. ORDER BY k.name



zwraca mi wszystkie mozliwe powiazania, a teraz nie wiem co do niego dolozyc aby zwracalo mi tylko powiazania pod konkretnym użytkownikiem i tylko dla 5 poziomów w głąb ;/

ma ktoś jakiś pomysł?

EDITED:

poszperałem po grupach i skleciłem coś takiego:

  1. SELECT
  2. k.user_name,
  3. p. *
  4. FROM temida_users k,temida_connections p
  5. WHERE parent_id
  6. IN (
  7. SELECT
  8. child_id
  9.  
  10. FROM temida_connections WHERE parent_id=10
  11. ) AND k.user_id = p.child_id AND p.depth BETWEEN 0 AND 2
  12. ORDER BY p.parent_id,p.child_id


wygląda na to że działa, wybiera ładnie strukturke, zobaczymy jak teraz pujdzie mi z obrobieniem tego w php winksmiley.jpg

Ten post edytował AcidBurnt 17.01.2006, 01:41:08
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 27.06.2025 - 06:25