Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL]posortowane zapytanie nasted sets
Forum PHP.pl > Forum > Przedszkole
fr3sh
Witam

Jeśli ktoś używał nasted sets to pewnie miał ten sam problem co ja. Otóż chciałbym
wyświetlić drzewo kategorii z tym iż chciałbym żeby kategorie były posortowane
alfabetycznie i ni w ząb nie moge jakoś sobie poradzić z zapytaniem.

Żeby wyświetlić stworzone drzewno za pomocą nasted sets używam takiego zapytania

[SQL] pobierz, plaintext
  1. SELECT CONCAT( REPEAT(' ', COUNT(parent.kat_nazwa) - 1), node.kat_nazwa) AS kat_nazwa, node.lft AS lft,node.rgt AS rgt,
  2. FROM kategorie AS node,
  3. kategorie AS parent
  4. WHERE node.lft BETWEEN parent.lft AND parent.rgt
  5. GROUP BY node.kat_nazwa
  6. ORDER BY node.lft
[SQL] pobierz, plaintext
No i wszystko byłoby pieknie gdybym miał stworzone alfabetycznie podczas dodawania ale nie mam
wiec chciałbym jakoś to załatwić bazodanowo.

Dla przybliżenia przykład wyżej zapytania

Cała kategoria
Filmy
Wojenne
Przygodowe
Horrory
Komputery
Laptopy
17 cali
15 cali
Stacjonarne

Ma ktoś jakiś pomysł na to??
Ewentualnie mogłoby być jakieś zapytanie przenoszące cała kategorie z wszystkimi jej dziećmi
o poziom wyżej.

POZDRAWIAM

Nie ma to jak samemu rozwiązywać swoje problemy smile.gif
Tak nawiasem mówiąc czy nikt tutaj nie korzysta
z nasted sets?

Jak tworzycie kategorie w swoich sklepach?
cojack
Dodaj:

  1. ORDER BY node.lft, node.kat_nazwa


i powinno dać radę
fr3sh
na samym poczatku tez tak myślałem ale nie daje rady bo najpierw ustawia porządek według unikatowych wartości lft
wiec nie ma co za drugim razem sortować wiec odpada
cojack
Dobra, zmusiłeś mnie do tego bym u siebie to sprawdził. Sprawdzę i dam znać.

@edit
w tym zapytaniu nie da się tego osiągnąć, musiałbyś sobie dodać dodatkową kolumnę np z sort i depth oraz unique na sort i depth i wtedy sortować po tych sortach sortów ;p
fr3sh
woow fajnie że się w końcu ktoś zainteresował i do tego sprawdził smile.gif

troszeczkę zawile to napisałeś jak byś mógł troszkę ta myśl
rozwinąć byłoby fajnie smile.gif

Pozdrawiam
cojack
Sorka ale ja nie znam się na mysql tak by napisać do niego funkcję na triggerze, jak chcesz mogę Ci napisać coś takiego dla ltree w postgresql. Nie używam po prostu mysql'a. Dlatego też nie znam jego pl/sql języka.
fr3sh
zapodaj jeśli możesz napewno się przyda smile.gif
cojack
  1. DROP TRIGGER "treeDepth" ON "tree";
  2. DROP FUNCTION "treeDepthFunction"();
  3. DROP TABLE "tree";
  4.  
  5. -- tabela
  6. CREATE TABLE "tree" (
  7. "path" LTREE,
  8. "sort" SMALLINT,
  9. "depth" SMALLINT,
  10. UNIQUE ( "sort", "depth" )
  11. );
  12.  
  13. -- indexy
  14. CREATE INDEX path_gist_idx ON "tree" USING gist(path);
  15. CREATE INDEX path_idx ON "tree" USING btree(path);
  16.  
  17. -- komentarze
  18. COMMENT ON COLUMN "tree"."path" IS 'Scieżka drzewa';
  19. COMMENT ON COLUMN "tree"."sort" IS 'Kolejność sortowania';
  20. COMMENT ON COLUMN "tree"."depth" IS 'Zagłębienie';
  21.  
  22. -- funkcja tworząca głębokość sortowania
  23. CREATE FUNCTION "treeDepthFunction"() RETURNS TRIGGER AS $$
  24. BEGIN
  25. SELECT
  26. nlevel( NEW."path" )
  27. INTO
  28. NEW."depth";
  29.  
  30. RETURN NEW;
  31. END;
  32. $$ LANGUAGE 'plpgsql';
  33.  
  34. -- trigger wykonujący się zawsze przed dodaniem nowej kategori
  35. CREATE TRIGGER "treeDepth"
  36. BEFORE INSERT ON "tree"
  37. FOR EACH ROW EXECUTE PROCEDURE "treeDepthFunction"();
  38.  
  39.  
  40. -- podstawowe wartości
  41. INSERT INTO "tree" VALUES ('Top', 1);
  42. INSERT INTO "tree" VALUES ('Top.Science', 1);
  43. INSERT INTO "tree" VALUES ('Top.Science.Astronomy', 1);
  44. INSERT INTO "tree" VALUES ('Top.Science.Astronomy.Astrophysics', 1);
  45. INSERT INTO "tree" VALUES ('Top.Science.Astronomy.Cosmology', 2);
  46. INSERT INTO "tree" VALUES ('Top.Hobbies', 2);
  47. INSERT INTO "tree" VALUES ('Top.Hobbies.Amateurs_Astronomy', 2);
  48. INSERT INTO "tree" VALUES ('Top.Collections', 3);
  49. INSERT INTO "tree" VALUES ('Top.Collections.Pictures', 1);
  50. INSERT INTO "tree" VALUES ('Top.Collections.Pictures.Astronomy', 1);
  51. INSERT INTO "tree" VALUES ('Top.Collections.Pictures.Astronomy.Stars', 1);
  52. INSERT INTO "tree" VALUES ('Top.Collections.Pictures.Astronomy.Galaxies', 2);
  53. INSERT INTO "tree" VALUES ('Top.Collections.Pictures.Astronomy.Astronauts', 3);


nie wiem czy Ci się to przyda ;]

@edit

a dodam więcej:

  1. SELECT subpath(path,-1), depth FROM tree;


przed chwilą to rozgryzłem ;p

zwraca nam ślicznie tylko ostatni liść:

Kod
ltree=> select subpath(path,-1) from tree;
      subpath
--------------------
Top
Science
Astronomy
Astrophysics
Cosmology
Hobbies
Amateurs_Astronomy
Collections
Stars
Galaxies
Astronauts
(11 rows)
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.