[Mysql] - order by date

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • rmfloris
  • Registratie: Maart 2002
  • Laatst online: 22-11-2024

rmfloris

Kowalski: Kaboeeem??

Topicstarter
Ik heb een iets wat complexere vraag (voor mij althans) en ik vroeg me af of het mogelijk was.

Ik heb een lijst met informatie welke allen een einddatum hebben. Deze informatie wordt gebruikt om actieve regels te laten zien (vandaag <= einddatum).
Ik ben nu bezig om ook een pagina te maken waarop alle regels staan, dus ook de niet actieve. Zo ver geen probleem.

Ik zou graag de sortering van het geheel iets anders willen dan simpel sorteren op einddatum. Ik wil graag eerst sorteren op alle actieve items (vandaag <= einddatum) gesorteerd op einddatum, gevolgd door alle niet actieve items (vandaag > einddatum) gesorteerd op datum. De sortering is dus eerst op actief/niet actief en dan op de einddatum.

Nu heb ik een aantal optie uit geprobeerd, maar ik blijf de sortering krijgen op einddatum, niet de tweedeling. Nu vroeg ik mijzelf af, is het überhaupt wel mogelijk of is het beter de query in tweeën te splitsen?

Foto afdrukken prijsvergelijk -> http://www.fotovergelijk.nl


Acties:
  • 0 Henk 'm!

  • KabouterSuper
  • Registratie: September 2005
  • Niet online
Ja, dat kan eenvoudig. Pseudocode:
code:
1
ORDER BY CASE WHEN vandaag<=einddatum THEN 0 ELSE 1 END, einddatum

[ Voor 1% gewijzigd door KabouterSuper op 05-03-2010 15:05 . Reden: Oeps...de 1 en de 0 verwisseld ]

When life gives you lemons, start a battery factory


Acties:
  • 0 Henk 'm!

  • cariolive23
  • Registratie: Januari 2007
  • Laatst online: 18-10-2024
Je kunt eenvoudig sorteren op meerdere kolommen:
ORDER BY
status ASC,
datum DESC

Acties:
  • 0 Henk 'm!

  • Salteh
  • Registratie: Januari 2003
  • Laatst online: 18-09 18:54
Misschien denk ik even te simpel.. maar is het niet gewoon ORDER BY active, einddatum?

[e]
Aangezien 'actief' geen veld is, maar alleen afgeleid kan worden uit datum < vandaag, lijkt de eerst gegeven oplossing me de beste :]

[ Voor 43% gewijzigd door Salteh op 05-03-2010 15:08 ]

BetterShifting.com | Strava


Acties:
  • 0 Henk 'm!

  • rmfloris
  • Registratie: Maart 2002
  • Laatst online: 22-11-2024

rmfloris

Kowalski: Kaboeeem??

Topicstarter
KabouterSuper schreef op vrijdag 05 maart 2010 @ 15:04:
Ja, dat kan eenvoudig. Pseudocode:
code:
1
ORDER BY CASE WHEN vandaag<=einddatum THEN 0 ELSE 1 END, einddatum
Volgens mij werkt deze optie. Vanavond even goed naar kijken als ik thuis ben.

M.b.t. de optie "order by active, einddatum". Er is helaas geen optie actief, dit is mede afhankelijk van de datum/tijd. Anders blijf ik bezig met updated :P

Foto afdrukken prijsvergelijk -> http://www.fotovergelijk.nl


Acties:
  • 0 Henk 'm!

  • Tharulerz
  • Registratie: April 2009
  • Laatst online: 10-04 05:16
Als je active mee in je select zet:

SELECT IF(vandaag <= einddatum,1,0) as active

Dan kan je daarna orderen op die active.

Acties:
  • 0 Henk 'm!

  • J2pc
  • Registratie: Oktober 2002
  • Niet online

J2pc

UT Tux Edition

rmfloris schreef op vrijdag 05 maart 2010 @ 15:09:
[...]


Volgens mij werkt deze optie. Vanavond even goed naar kijken als ik thuis ben.

M.b.t. de optie "order by active, einddatum". Er is helaas geen optie actief, dit is mede afhankelijk van de datum/tijd. Anders blijf ik bezig met updated :P
Sorry, maar ik snap echt je vraag niet.

Als actief afhankelijk is van de einddatum t.o.v. huidige datum, en je sorteert met de 'grootste' (meest in de toekomst) einddatum bovenaan (=desc), dan komen toch vanzelf je actieve regels bovenaan, en de inactieve daaronder (aangezien hun datum kleiner is)?

/edit
En als je 2 keer 'vandaag' bonvenaan wil hebben
Dus:
code:
1
2
3
4
5
6
7
- actief t/m vandaag
- actief t/m morgen
etc..

- inactief vanaf gisteren
- inactief vanaf eergisteren
etc...


Dan zul je met een UNION moeten werken.
Je wilt dan namelijk je 2e sorteer volgordes hebben, afhankelijk van de status. Voorzover ik weet kan dat niet in 1 select.

Dus zoiets
SQL:
1
2
3
4
5
6
7
8
9
10
11
SELECT *
FROM tabel
WHERE einddatum >= vandaag
ORDER BY einddatum ASC

UNION

SELECT *
FROM tabel
WHERE einddatum < vandaag
ORDER BY einddatum DESC


Bedoel je dat?

[ Voor 30% gewijzigd door J2pc op 05-03-2010 15:33 ]

"The computer is incredibly fast, accurate, and stupid. Man is unbelievably slow, inaccurate, and brilliant. The marriage of the two is a challenge and opportunity beyond imagination." © Stuart G. Walesh


Acties:
  • 0 Henk 'm!

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
KabouterSuper schreef op vrijdag 05 maart 2010 @ 15:04:
Ja, dat kan eenvoudig. Pseudocode:
code:
1
ORDER BY CASE WHEN vandaag<=einddatum THEN 0 ELSE 1 END, einddatum
Is dat niet gewoon een order by vandaag > einddatum, einddatum?

Acties:
  • 0 Henk 'm!

  • rmfloris
  • Registratie: Maart 2002
  • Laatst online: 22-11-2024

rmfloris

Kowalski: Kaboeeem??

Topicstarter
KabouterSuper schreef op vrijdag 05 maart 2010 @ 15:04:
Ja, dat kan eenvoudig. Pseudocode:
code:
1
ORDER BY CASE WHEN vandaag<=einddatum THEN 0 ELSE 1 END, einddatum
Het heeft even geduurd voordat ik er naar kon kijken, maar het werkt. Ik zag nu zelf ook dat mijn beschrijving niet helemaal goed was. Het venijn zit hem in dat ik 2 datums heb waar ik op wil sorteren, een begindatum en een einddatum. De laatste begindatum moet bovenaan staan, dan pas op einddatum sorteren. Maar ik wilde ook graag een splitsing tussen welke artikelen 'actief' waren en welke niet. Dmv bovenstaande toevoeging werkt het perfect!

code:
1
SELECT * FROM table ORDER BY CASE WHEN '$vandaag' <= eind_datum THEN 0 ELSE 1 END, begin_datum, eind_datum

Foto afdrukken prijsvergelijk -> http://www.fotovergelijk.nl


Acties:
  • 0 Henk 'm!

Verwijderd

Olaf van der Spek schreef op vrijdag 05 maart 2010 @ 15:31:

Is dat niet gewoon een order by vandaag > einddatum, einddatum?
Dat klopt ja. Ik zie in dit topic al drie voorbeelden van mensen voor wie booleans blijkbaar te moeilijk zijn...
SQL:
1
ORDER BY CASE WHEN vandaag<=einddatum THEN 0 ELSE 1 END, einddatum
Dit is haast net zo lomp als:
PHP:
1
2
3
4
5
if ( $vandaag <= $einddatum ) {
   return false;
} else {
   return true;
}
SQL:
1
SELECT IF(vandaag <= einddatum,1,0) as active
Mag ook iets simpeler:
SQL:
1
SELECT vandaag <= einddatum AS active
Dus zoiets
SQL:
1
2
3
4
5
6
7
8
9
10
11
SELECT *
FROM tabel
WHERE einddatum >= vandaag
ORDER BY einddatum ASC

UNION

SELECT *
FROM tabel
WHERE einddatum < vandaag
ORDER BY einddatum DESC
En wat is er mis met:
SQL:
1
ORDER BY einddatum >= vandaag DESC, ABS(DATEDIFF(vandaag, einddatum)) ASC


Er wordt echt onnodig moeilijk gedaan in dit topic.

Acties:
  • 0 Henk 'm!

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Waarom die ABS(DATEDIFF :?

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


Acties:
  • 0 Henk 'm!

Verwijderd

Als je wilt sorteren zoals J2pc voorstelt (volgens mij is dit overigens niet wat de TS wil), moet je de absolute waarde hebben zodat je het verschil in dagen krijgt. DATEDIFF kan ook een negatief getal teruggeven en dat moet in het geval van J2pc niet. Volgens mij postte ik dus het equivalent van zijn UNION query.

Acties:
  • 0 Henk 'm!

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Verwijderd schreef op zondag 28 maart 2010 @ 12:26:
[...]
(volgens mij is dit overigens niet wat de TS wil),
Ja, ok. Ik snap wat je wil, maar ik kon idd niet de relatie met de wens van TS ontdekken.

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

Pagina: 1