[MySQL] Category list met recursieve structuur

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • GWTommy
  • Registratie: Mei 2008
  • Laatst online: 05-08-2023
Hallo,
Ik ben bezig met een categorie lijst, zoals hier bijvoorbeeld bij review archief. Ik gebruik één tabel met een parent-child-hierarchical structuur. Nu wil ik met één query een complete array krijg van alle categorieën.

Ik wil dus een oneindig diepe structuur. Ik weet niet hoe ik dit het beste in een query kan doen en wat de beste manier is om dit ook in een array te krijgen en vervolgens netjes weer te geven.

Edit: ik heb zelf natuurlijk ook al gezocht, etc. Ik kwam oa hier op uit:
http://dev.mysql.com/tech...es/hierarchical-data.html
Maar dat is voor mij nog iets te moeilijk en ik heb een beetje het idee dat ik daarmee niet precies krijg wat ik wil.

Iemand die mij hiermee kan helpen is hard nodig. Thanks!

[ Voor 21% gewijzigd door GWTommy op 08-01-2009 18:47 . Reden: Toegevoegd waar ik al naar had gezocht. ]


Acties:
  • 0 Henk 'm!

Verwijderd

onze eigen crisp heeft hier al eens een mooie blogpost over geschreven
http://crisp.tweakblogs.n...using-only-one-query.html

Acties:
  • 0 Henk 'm!

  • GWTommy
  • Registratie: Mei 2008
  • Laatst online: 05-08-2023
Hey bedankt man, als ik nou alles in een array pleur en doorgeef aan de view, dan gaat het lukken.

En met een beetje sleutelen aan die code gaat dat ook lukken om zulke comments te creëren zoals hier ook is bij het nieuws enzo?

Edit: en stel dat ik een id van een categorie heb, ik wil dan de informatie van die categorie ophalen en vervolgens de children. Dan wil ik natuurlijk niet alle categorieën (worden er veel, gok zo'n 300 tot 500) ophalen. Is daar een oplossing voor?

[ Voor 35% gewijzigd door GWTommy op 08-01-2009 19:11 ]


Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

GWTommy schreef op donderdag 08 januari 2009 @ 19:06:
En met een beetje sleutelen aan die code gaat dat ook lukken om zulke comments te creëren zoals hier ook is bij het nieuws enzo?
Ja
Edit: en stel dat ik een id van een categorie heb, ik wil dan de informatie van die categorie ophalen en vervolgens de children. Dan wil ik natuurlijk niet alle categorieën (worden er veel, gok zo'n 300 tot 500) ophalen. Is daar een oplossing voor?
Alweer ja.

Kom op zeg. Een beetje eigen initiatief kan geen kwaad..

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

  • Noork
  • Registratie: Juni 2001
  • Niet online
GWTommy schreef op donderdag 08 januari 2009 @ 19:06:
Edit: en stel dat ik een id van een categorie heb, ik wil dan de informatie van die categorie ophalen en vervolgens de children. Dan wil ik natuurlijk niet alle categorieën (worden er veel, gok zo'n 300 tot 500) ophalen. Is daar een oplossing voor?
Misschien zou een basiscursus/tutorial/boek over SQL niet verkeerd voor jou zijn.

Acties:
  • 0 Henk 'm!

  • GWTommy
  • Registratie: Mei 2008
  • Laatst online: 05-08-2023
Ik snap alleen niet veel van het hogere MySQL. Dit is mijn maximum wat ik kan:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT
                                            newsItems.id,
                                            newsItems.title,
                                            newsItems.author,
                                            UNIX_TIMESTAMP(newsItems.date) AS date, 
                                            newsItems.gameHeader, 
                                            (
                                                SELECT 
                                                    COUNT(DISTINCT globalComments.id)
                                                FROM globalComments
                                                WHERE globalComments.ident = CONCAT('news_', newsItems.id)
                                            ) AS commentCount
                                            FROM newsItems
                                            WHERE
                                                newsItems.language = '" . $_SESSION['languageSettings']['currentLanguage'] . "'
                                                AND newsItems.deleted = 0
                                                AND newsItems.date >= DATE_SUB(NOW(), INTERVAL 2 DAY)
                                            GROUP BY newsItems.id, newsItems.title, newsItems.author, newsItems.date, newsItems.gameHeader, newsItems.deleted, newsItems.language
                                            ORDER BY newsItems.date DESC


Verder gebruik ik al 4 jaar MySQL. Maar ik snap nog steeds geen h*l van JOIN, maar dat zal ook nog wel even duren.

En natuurlijk is dit de makkelijke manier, maar ja dan doe ik het zo maar, anders heb ik nog een tijdje bezig.

Acties:
  • 0 Henk 'm!

  • Y0ur1
  • Registratie: Oktober 2000
  • Niet online
GWTommy schreef op donderdag 08 januari 2009 @ 22:13:
Ik snap alleen niet veel van het hogere MySQL. Dit is mijn maximum wat ik kan:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT
                                            newsItems.id,
                                            newsItems.title,
                                            newsItems.author,
                                            UNIX_TIMESTAMP(newsItems.date) AS date, 
                                            newsItems.gameHeader, 
                                            (
                                                SELECT 
                                                    COUNT(DISTINCT globalComments.id)
                                                FROM globalComments
                                                WHERE globalComments.ident = CONCAT('news_', newsItems.id)
                                            ) AS commentCount
                                            FROM newsItems
                                            WHERE
                                                newsItems.language = '" . $_SESSION['languageSettings']['currentLanguage'] . "'
                                                AND newsItems.deleted = 0
                                                AND newsItems.date >= DATE_SUB(NOW(), INTERVAL 2 DAY)
                                            GROUP BY newsItems.id, newsItems.title, newsItems.author, newsItems.date, newsItems.gameHeader, newsItems.deleted, newsItems.language
                                            ORDER BY newsItems.date DESC


Verder gebruik ik al 4 jaar MySQL. Maar ik snap nog steeds geen h*l van JOIN, maar dat zal ook nog wel even duren.

En natuurlijk is dit de makkelijke manier, maar ja dan doe ik het zo maar, anders heb ik nog een tijdje bezig.
Wow 4 jaar met MySQL werken en geen JOINS kennen? Anyway er is nog een interessante manier om dit op te lossen: http://www.sitepoint.com/article/hierarchical-data-database/ (Dan bedoel ik dus niet de eerste manier want die wordt al uitgelegd op mysql.com) Maar als je joins nog niet snapt is dit misschien iets te hoog gegrepen.

Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Ga inderdaad voor de MPTT manier die Y0ur1 beschrijft. Dat is een veel eenvoudigere en snellere manier om hiërarchische data op te slaan. Je zal namelijk veel vaker de data ophalen dan hem wijzigen. Dan is de keuze voor MPTT al snel te verantwoorden :)

Acties:
  • 0 Henk 'm!

  • winkbrace
  • Registratie: Augustus 2008
  • Laatst online: 24-08 15:17
En op zulke momenten zie je dat MySQL nog wel wat uit te breiden valt. In Oracle gebruik je hiervoor de CONNECT BY met LEVEL clausules. Dan los je het direct in SQL op zonder extra tabellen of functies.
Pagina: 1