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
Kategori
Computerworld tilbyder specialiserede kurser i database-management

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