[MYSQL] Union op eigen tabel met ORDER BY

Pagina: 1
Acties:

  • hennink
  • Registratie: Augustus 2000
  • Laatst online: 07-05 20:50
wie o wie heeft hier een oplossing voor?
Het een applicatie met daarin ondere een tabel met vertrektijden.
Er moet een weergave komen die het volgende doet, namelijk sorteren op datum en vertrektijd.
Het lastige is echter dat de tijden tussen 24:00 en 05:00 achteraan de lijst moeten staan omdat dan de dienstregeling stopt voor de bewuste dag.
We hebben nu deze query:
code:
1
(SELECT t.db_id,t.vertrektijd FROM tijden AS t WHERE (t.datum >= DATE_ADD(NOW(), INTERVAL 0 DAY)) AND (t.datum <= DATE_ADD(NOW(), INTERVAL 0 DAY)) AND (t.doelgroep = '65plus') AND begintijd > 050000 ORDER BY t.datum, t.begintijd) UNION (SELECT t.db_id,t.vertrektijd FROM tijden AS t WHERE (t.datum >= DATE_ADD(NOW(), INTERVAL 0 DAY)) AND (t.datum <= DATE_ADD(NOW(), INTERVAL 0 DAY)) AND (t.doelgroep = '65plus') AND begintijd <= 050000 ORDER BY t.datum, t.begintijd)

Het vervelende van de UNION die hier gebruikt wordt is het volgende.
In de subqueries staat de volgorde precies goed. Je krijgt een lijst met vertrektijden gesorteerd op tijd.
Hij begint dus om 05:00 en loopt de 24:00 voor de eerste query.
De 2e pakt dan 00:00 tot 05:00
Maar de union zorgt ervoor dat heel de sortering weer weg is.
Het probleem is ook nog zo dat als je de query aan het eind zou uitbreiden met ORDER BY t.datum,t.begintijd dat je een grote lijst krijgt die begin om 00:00 en eindigt op 24:00
Dit mag echter niet omdat nu bovenaan de vertrektijden staan van trips die later op de dag voorkomen(in de nacht, dus eigenlijk al de volgende dag en datum , maar zo werkt deze dienstregeling helaas niet)

[ Voor 5% gewijzigd door hennink op 14-03-2005 11:05 ]

alles wat aan kan, gaat kapot. De vraag is alleen wanneer.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 07-05 22:49

curry684

left part of the evil twins

Uhm als je nu eens begint met die query tussen [code] tags te zetten een beetje fatsoenlijk te layouten, want zo begin ik er al niet eens aan :X

Professionele website nodig?


  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 19:05
Je kan met IF (althans in MySQL, je vermeld geen SQL server verder) een constructie maken die 1 dag van de datum aftrekt als de tijd tussen 0 en 5 ligt. Vervolgens kun je dan gewoon doen ORDER BY op `datum`, `tijd`...

[ Voor 72% gewijzigd door Morrar op 11-03-2005 17:59 ]


  • Skaah
  • Registratie: Juni 2001
  • Niet online
Morrar schreef op vrijdag 11 maart 2005 @ 17:55:
Je kan met IF (althans in MySQL, je vermeld geen SQL server verder) een constructie maken die 1 dag van de datum aftrekt als de tijd tussen 0 en 5 ligt. Vervolgens kun je dan gewoon doen ORDER BY op `datum`, `tijd`...
Hiervoor heb je de CASE ... THEN ... ELSE ... END constructie die wel deel van de SQL standaard is. (Werkt ook in MySQL)

Verwijderd

Wat je altijd kan doen is in beide queries een statisch veld opnemen in de trant van

SQL:
1
2
3
4
select '1' AS Sortfield, tijd, * from table where tijd >5
Union ALL
select '2' AS Sortfield, tijd,* from table where tijd <5
ORDER By 1,2

[ Voor 14% gewijzigd door Verwijderd op 12-03-2005 19:05 ]


  • hennink
  • Registratie: Augustus 2000
  • Laatst online: 07-05 20:50
idd, sort veld erbij en het werkt naar behoren.
Zijn altijd de te makkelijke dingen waar je overheen kijkt.
Dank je

alles wat aan kan, gaat kapot. De vraag is alleen wanneer.


  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 04-05 09:32
Als ik je goed begrijp wil je alle ritten hebben van bijv. vandaag 05.00 t/m morgen 05.00u als je zoek op vandaag?
Volgens mij heb je dan geen union nodig, maar kun je het vertrektijd veld een 2e keer selecteer maar dan met
code:
1
DATE_ADD(vertrektijd INTERVAL -5 HOURS) as sortorder

en dan een order op sortorder

Mmm.. ik bedenk me nu dat jouw vertrektijden geen datetime velden zullen zijn... Dus wat ik hier zeg is waarschijnlijk hier niet toepasbaar.

Ik laat het toch maar even staan ;)
Pagina: 1