Avatar billede Mik2000 Professor
02. november 2022 - 20:32 Der er 7 kommentarer og
1 løsning

Order by med subid

Hej

Hvis jeg har en tabel
TABEL1
id
subId
navn
dato

og nogle poster i den
1  NULL  Top niveau 1                2022-05-01
2  NULL  Top niveau 2                2022-05-14
3  1          Sub niveau til ID 1        2022-05-05
4  1          Og sub niveau til ID 1  2022-05-04
5  2          Sub niveau til ID 2        2022-05-15

Nu vil jeg gerne lave en SQL som henter alle, og som sorterer på dato, dog med dem der har subId under dem de hører til

Dvs output bliver i denne rækkefølge
1: 1  Top niveau 1
2: 3  Sub niveau til ID 1
3: 4  Og sub niveau til ID 1
4: 2  Top niveau 2
5: 5  Sub niveau til ID 2

Hvordan kan det så gøres smartest og mest optimalt ift. hastighed/serverforbrug med en SQL?

På forhånd tak - og spørg endelig :)
Avatar billede erikjacobsen Ekspert
02. november 2022 - 23:24 #1
select * from tabel1 order by ifnull(subid,id)*1000,id;
Avatar billede erikjacobsen Ekspert
02. november 2022 - 23:25 #2
Og faktisk uden at gange med 1000 - det var bare et eksperiment:

    select * from tabel1 order by ifnull(subid,id),id;
Avatar billede arne_v Ekspert
03. november 2022 - 00:31 #3
Mit forslag er lidt mere kompliceret.

SELECT t1a.id,t1a.navn,t1a.dato
FROM tabel1 t1a LEFT JOIN tabel1 t1b ON t1a.subid = t1b.id -- t1a = row, t1b = parent row
ORDER BY COALESCE(t1b.dato,t1a.dato), -- order by parent row to order parent rows
        COALESCE(t1b.id,t1a.id), -- order by parent row id to split multiple paraent rows with same dato
        t1a.dato; -- order by row dato to order rows below parent row
Avatar billede arne_v Ekspert
03. november 2022 - 00:31 #4
Men det er jo tydeligvis en træ struktur.

Træ strukturer og relations databaser er et helvede.
Avatar billede arne_v Ekspert
03. november 2022 - 00:34 #5
Hvis MySQL 8.0+ kunne man prøve om en Recursive CTE var bedre.
Avatar billede Mik2000 Professor
03. november 2022 - 14:51 #6
Arne_v: Denne løsning ser ud til at virke uanset hvilke forhold, rækkefølge osv. det ligger i, så længe sub har en senere dato end den anden

Tak for hjælpen :)

Hvis man vil have dem sorteret DESC ser det ud til det er sådan ik
SELECT t1a.id,t1a.navn,t1a.dato
FROM tabel1 t1a LEFT JOIN tabel1 t1b ON t1a.subid = t1b.id -- t1a = row, t1b = parent row
ORDER BY COALESCE(t1b.dato,t1a.dato) DESC,
COALESCE(t1b.id,t1a.id) DESC,
t1a.dato;
Avatar billede arne_v Ekspert
03. november 2022 - 15:14 #7
DESC betyder faldende sortering.

Men jeg kan ikke lige gennemskue om den variant får parent rows ovenover child rows.
Avatar billede arne_v Ekspert
03. november 2022 - 15:17 #8
#4 !!!!

Hvis du kan lide meget eksotiske løsninger:
    https://www.vajhoej.dk/arne/articles/phpcr.html

(det er et lidt langt læs, men det er grundliggende et træ venligt API ovenpå database)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester