[SQL] parent sorteren op laatste child

Pagina: 1
Acties:
  • 206 views sinds 30-01-2008
  • Reageer

  • amoen
  • Registratie: Juni 2003
  • Laatst online: 18-11-2025
hopelijk een duidelijke titel

ik heb 1 tabel:
code:
1
2
3
4
5
6
7
8
9
10
id  |  parent_id  |  titel    |  datum      |
---------------------------------------------
1   |  0          |  tekst x  |  2006-09-10 |
2   |  1          |  hoi hoi  |  2006-10-09 |
3   |  0          |  tekst y  |  2006-09-11 |
4   |  3          |  doing    |  2006-10-11 |

gewenste resulaat:
1. tekst y  (laatste bericht 2006-10-11)
2. tekst x  (laatste bericht 2006-10-09)

en ik zoek naar een manier om alle records met parent_id = 0 te sorteren op de laatste datum van de records met DAT parent_id = id... haha ik weet niet zo goed hoe ik het moet omschrijven.

ik zit dus te denken aan een ORDER BY 'datum' maar hij moet dus de datum pakken van de 'child' en niet die van de 'parent'

ik wilde het dus makkelijk doen, door start-berichten en reacties te plaatsen in dezelfde tabel met een simpel parent_id idee, maar misschien dat ik toch de start-berichten en reacties dan in een aparte tabel moet zetten? want dan snap ik het verder wel...

heeeeee ..... hoe is het?


  • lier
  • Registratie: Januari 2004
  • Nu online

lier

MikroTik nerd

select titel from [tabelnaam] where parent_id = 0 order by datum desc ?

Edit:

Zie nu pas dat je de parents wil tonen op basis van de datum van de childs...

Nog heel even denken.

[ Voor 44% gewijzigd door lier op 11-10-2006 13:57 ]

Eerst het probleem, dan de oplossing


  • amoen
  • Registratie: Juni 2003
  • Laatst online: 18-11-2025
dan sorteert ie dus op datum van de 'parent' en niet op die van de laatste child...
mmz misschien anders de datum van de parent updaten als er een nieuwe child is geplaatst?

dan los ik het probleem wel op...

edit:
ja je had het dus toch gezien ;)

[ Voor 9% gewijzigd door amoen op 11-10-2006 13:59 ]

heeeeee ..... hoe is het?


  • lier
  • Registratie: Januari 2004
  • Nu online

lier

MikroTik nerd

Welk DBMS is hier van toepassing ?

Dit in verband met de SQL standaard...

Edit1:

Je kan natuurlijk je tabel voorzien van een extra kolom met date_last_update toevoegen.
Misschien niet zo heel netjes (in het kader van normaliseren), maar performancetechnisch gezien wel lekker snel.

[ Voor 58% gewijzigd door lier op 11-10-2006 14:03 ]

Eerst het probleem, dan de oplossing


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Een simpel GROUP BY met een MAX moet dit wel kunnen doen:

SQL:
1
2
3
4
5
SELECT t1.tekst, max(t2.datum) AS DatumLaatsteReactie
FROM Tabel t1
LEFT OUTER JOIN Tabel t2 ON t1.id = t2.parent_id
WHERE t1.parent_id = 0
GROUP BY t1.tekst


Uit Programming FAQ - SQL :
Hoe werken Joins
Hoe werkt Group By

Oops! Google Chrome could not find www.rijks%20museum.nl


  • lier
  • Registratie: Januari 2004
  • Nu online

lier

MikroTik nerd

P_de_B schreef op woensdag 11 oktober 2006 @ 14:08:
Een simpel GROUP BY met een MAX moet dit wel kunnen doen:

SQL:
1
2
3
4
5
SELECT t1.tekst, max(t2.datum) AS DatumLaatsteReactie
FROM Tabel t1
LEFT OUTER JOIN Tabel t2 ON t1.id = t2.parent_id
WHERE t1.parent_id = 0
GROUP BY t1.tekst


Uit Programming FAQ - SQL :
Hoe werken Joins
Hoe werkt Group By
Was ook mijn eerste gedachte, maar dan neem je nog niet de mogelijkheid mee voor parents zonder kinderen.

Dit kan je oplossen met:

ISNULL(max(t2.datum) ,t1.datum) (ennuh...ORDER BY DESC toevoegen)

Vraag blijft of je het op deze manier op wil lossen (performance...), of is dit een huiswerk opdracht ?

Eerst het probleem, dan de oplossing


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Ik doe al een left outer join, dan komt er een NULL (= 'onbekend') voor datum laatste reactie als er geen reacties zijn. Dat lijkt me op zicht wel goed. Maar je hebt gelijkt. Met ISNULL kun je daar een andere waarde voor teruggeven.

Ik zou me trouwens met dit soort queries geen zorgen maken over performance. Het joinen van tabellen is juist de kracht van een RDBMS. Ik kan me situaties voorstellen dat je gaat denormaliseren omwille van performance, maar dan alleen bij erg zware queries, niet bij deze.

[ Voor 37% gewijzigd door P_de_B op 11-10-2006 14:15 ]

Oops! Google Chrome could not find www.rijks%20museum.nl


  • amoen
  • Registratie: Juni 2003
  • Laatst online: 18-11-2025
ok de sql van PdB werkt prima,

maar als ik daarbij de ISNULL bij stop, gaat het helaas mis :'(

dit is mijn echte querie:
SQL:
1
SELECT a.*, ISNULL(MAX(b.dis_datum),a.dis_datum) FROM `discussie` a LEFT OUTER JOIN  `discussie` b ON (a.dis_id=b.dis_parent) WHERE a.dis_parent = '0' GROUP BY a.dis_id ORDER BY b.dis_datum DESC


en hij stopt na: "ISNULL(MAX(b.dis_datum)," « de komma?

heeeeee ..... hoe is het?


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Welke database gebruik je? Voor MySQL kun je ipv ISNULL COALESCE gebruiken. ISNULL is specifiek voor MSSQL.

edit:
LAAT MAAR: je gebruikt MySQL. De geweldige database die het toestaat bij een GROUP BY kolommen in je select op te nemen die geen aggregate funtie hebben, of voorkomen in de GROUP BY clausule.

Die SELECT a.* kan niet. Je moet dan ook de overige velden van a opnemen in de GROUP BY, of een aggregatie functie (SUM, MAX MIN etc) opnemen voor de velden die niet in de GROUP BY zitten.

[ Voor 64% gewijzigd door P_de_B op 11-10-2006 14:28 ]

Oops! Google Chrome could not find www.rijks%20museum.nl


  • amoen
  • Registratie: Juni 2003
  • Laatst online: 18-11-2025
aah vandaar, ik gebruik MYSQL,

chips... met die coalesce werkt het wel, maar bij het sorteren op b.dis_datum retourneerd ie 'natuurlijk' NULL bij de parent zonder childs! dus komt dat bericht automatisch onderaan te staan.
SQL:
1
SELECT a.dis_datum,b.dis_datum,a.dis_id, COALESCE(MAX(b.dis_datum),a.dis_datum) FROM `discussie` a LEFT OUTER JOIN  `discussie` b ON (a.dis_id=b.dis_parent) WHERE a.dis_parent = '0' GROUP BY a.dis_id ORDER BY b.dis_datum DESC

kan ik d.dis_datum niet vervangen met a.dis_datum als ie op NULL staat?

[ Voor 42% gewijzigd door amoen op 11-10-2006 14:37 ]

heeeeee ..... hoe is het?


  • amoen
  • Registratie: Juni 2003
  • Laatst online: 18-11-2025
aha! :)

ik denk de oplossing gevonden te hebben met IFNULL:

SQL:
1
SELECT a.dis_datum,b.dis_datum,a.dis_id, IFNULL(MAX(b.dis_datum),a.dis_datum) as `sorteer` FROM `discussie` a LEFT OUTER JOIN  `discussie` b ON (a.dis_id=b.dis_parent) WHERE a.dis_parent = '0' GROUP BY a.dis_id ORDER BY `sorteer` DESC


door er een naam aan te geven: `sorteer` kan ik daar dan ook weer het resultaat op sorteren!
zien jullie nog gekke dingen?

zo niet, super bedankt voor de hulp op de goede weg!

heeeeee ..... hoe is het?


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Je moet a.dis_datum ook nog in de GROUP BY clausule opnemen of een een aggragatie functie omheen zetten, het werkt nu wel omdat het MySQL is, maar het is niet correct.

Oops! Google Chrome could not find www.rijks%20museum.nl

Pagina: 1