Avatar billede dk-coders Nybegynder
20. februar 2014 - 22:26 Der er 8 kommentarer og
1 løsning

Speciel dobbelt ORDER BY i MySQL

Hej,

Jeg har en tabel med 3 kolonner:

ID (xx)
DATE (xxxx-xx-xx)
OPENED (0/1)


Jeg ønsker at sortere tabellen efter DATE (nyeste først) - dertil ønsker jeg så, hvis OPENED er 0 (nul), inden for de sidste 5 dage, skal disse øverst (altså en form for overruling/første prioritet).

Gir det mening?
Avatar billede repox Seniormester
20. februar 2014 - 22:40 #1
Medmindre du registrerer åbningstidspunktet, kan du ikke sortere på om noget har været åbnet inden for de sidste fem dage.
Avatar billede dk-coders Nybegynder
20. februar 2014 - 23:02 #2
Det er jo muligt at prioritere OPENED først, så burde det vel også kunne lade sig gøre inden for en begrænset periode?
20. februar 2014 - 23:13 #3
........eller refererer du ikke til åbningstidspunktet, men til rækker i tabellen, hvor datoen er højst fem dage gammel og opened er 0?  Og vil du, at disse rækker skal stå øverst, i dato rækkefølge, efterfulgt af alle andre rækker i datorækkefølge?
I så fald vil jeg foreslå en løsning med UNION.  Nu er det nogen tid siden jeg har været i gang med at beregne datoer (og jeg har drukket for mange øller til at starte nu), så jeg skriver i pseudokode, noget i retning af dette:

SELECT * FROM minTabel WHERE [datoen er højst fem dage gammel] AND opened = 0 ORDER BY date
UNION
SELECT * FROM minTabel WHERE ID NOT IN (SELECT ID FROM minTabel WHERE [datoen er højst fem dage gammel] AND opened =0) ORDER BY date
20. februar 2014 - 23:33 #4
Så #1 (stadig i pseudokode)

IF [spørgeren bekræfter, at dette er problemstillingen]
AND [du er rimelig enig i princippet i min pseudokode]
AND ([du har dato beregninger på fingerspidserne] OR [du har drukket færre øller end mig])
THEN [så kan du gøre koden færdig og få spørgsmålet lukket]
Avatar billede arne_v Ekspert
22. februar 2014 - 01:31 #5
Uden 5 dages kriteriet:

... ORDER BY OPENED ASC, DATE DESC

Med 5 dage kriteriet:

... ORDER BY IF(OPENED=0 AND DATE > ?,0,1) ASC,DATE DESC
Avatar billede dk-coders Nybegynder
22. februar 2014 - 11:30 #6
Hej Arne,

Super indlæg. Jeg går ud fra at ? er antallet af dage?

Jeg har dog et problem, at den viser ALLE records hvor OPENED er 0, selvom DATE er OVER 5 dage - hvorfor?
Avatar billede arne_v Ekspert
22. februar 2014 - 14:57 #7
? er tidspunktet for 5 dage siden.

Det kan saa enten udregnes i PHP eller i SQL. Med SQL maa det vaere DATE_SUB(NOW(), INTERVAL 5 DAY).
Avatar billede dk-coders Nybegynder
26. februar 2014 - 16:06 #8
Tak Arne - det var svaret... smider du lige et svar?
Avatar billede arne_v Ekspert
26. februar 2014 - 16:19 #9
svar
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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