Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: pobieranie danych drzewa
Forum PHP.pl > Forum > PHP
AcidBurnt
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....
NuLL
Na wortalu jest artykul o drzewkach. Rowniez www.depesz.com
bigZbig
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.
ActivePlayer
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
AcidBurnt
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
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.