[SQL] Sorteren met een IN?

Pagina: 1
Acties:

  • Sonic
  • Registratie: Februari 2000
  • Laatst online: 18-05 08:57
dit me querry:
SELECT * FROM tblAanbod a INNER JOIN TblNaw L on L.NawID = a.NawID INNER JOIN tbldvd d on a.dvdID = d.dvdID WHERE a.AanbodID IN (297 , 125 , 300 )
Die nummers bij aanbod ID komen uit een sessie.. Als je artikelen selecteert slaat hij dat op in een sessie zodat je later kan zien wat je hebt geselecteerd

Nou laat hij op beeld zien als ik met een
while not rs.eof werk
laat hij eerst 125 zien dan 297 en dan 300...

Maar ik wil juist hoe het in de IN staat eerst
297 dan
125 en dan
300

Gewoon wat je het eerst hebt gekocht (geselecteerd) dat hij het dan ook als eerst op het scherm laat zien en niet wat je daarna hebt gekocht..

[edit]
De grootte van de in is nu 3 ( 3 cijfers) maar het kan ook 15 cijfers zijn als je 15 artikelen koopt...

[ Voor 8% gewijzigd door Sonic op 15-12-2003 13:58 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:14
Sorteren doe je niet met de IN clausule (en sorteren heeft ook niets te maken met filtering), maar met de ORDER BY clause.

https://fgheysels.github.io/


  • Sonic
  • Registratie: Februari 2000
  • Laatst online: 18-05 08:57
whoami schreef op 15 december 2003 @ 14:00:
Sorteren doe je niet met de IN clausule (en sorteren heeft ook niets te maken met filtering), maar met de ORDER BY clause.
yup klopt...?
Dat snap ik.. Dit was ook totaal niet mijn vraag

Maar hoe ga ik dat met een order by doen dat is dus mijn vraag??
Ik dacht dat als ik het in de IN zet (297,125,300)
dat hij automatisch die nummers deed.. iemand een oplossing
Want ik kan wel order by aanbodID doen
maar dan kan ik het alleen optelend of aftelend laten werkend (DESC en ASC)

[ Voor 17% gewijzigd door Sonic op 15-12-2003 14:04 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:14
code:
1
2
WHERE a.aanbodId IN ( ..... )
ORDER BY a.aanbodId

dus.....

Redelijk basic.

Dat was dus wel je vraag. Je wilt nl. de gegevens van hetgeen je als eerste besteld hebt, als eerste zien, etc.... Of duiden die nummertjes in je IN clause geen volgorde van bestellen aan ofzo?

[ Voor 57% gewijzigd door whoami op 15-12-2003 14:06 ]

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 13:28

gorgi_19

Kruimeltjes zijn weer op :9

Hoe wil jij SQL die logica wijsmaken? Oftewel: Wat is de logica van de sortering die jij geeft? Hoe kom je aan die getallen? Komen die uit een andere tabel?

[ Voor 25% gewijzigd door gorgi_19 op 15-12-2003 14:08 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Sonic
  • Registratie: Februari 2000
  • Laatst online: 18-05 08:57
ORDER BY a.aanbodId

dan gaat hij het dus in zo lompe aftellende of oplopende volgorde zetten
dat is niet mijn bedoeling.. hij moet het gewoon precies uitprinten hoe het in de IN staat

als ik het er ook achter zet gebeurt er niks hoor.. dus staat het nog steeds verkeerd.. Gebruik ik DESC of ASC jah dan werkt het wel maar dan staat het als nog verkeerd.. Hij laat dus nog steeds die 125 als eerste zien...
Voor de duidelijkheid:
code:
1
2
3
4
5
SELECT * FROM tblAanbod a 
      INNER JOIN TblNaw L on L.NawID = a.NawID 
      INNER JOIN tbldvd d on a.dvdID = d.dvdID 
      WHERE a.AanbodID IN (297 , 125 , 300 ) 
      ORDER BY a.aanbodID

[ Voor 96% gewijzigd door Sonic op 15-12-2003 14:12 ]


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Kan niet, dit zul je op moeten lossen buiten SQL.
Gooi bijvoorbeeld de resultaten in een array en gebruik het id als index.
Dan kan je door de bewaarde selectie heenlopen en de bijbehorende resultaten uit de array halen.

Who is John Galt?


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:14
Tja, zorg ervoor dat het item dat je als eerste selecteert een lager nr krijgt dan het item dat je als 2de selecteert.
Hou misschien een apart tellertje oid bij waar je dan op sorteert ipv op sessie-id

https://fgheysels.github.io/


  • Sonic
  • Registratie: Februari 2000
  • Laatst online: 18-05 08:57
whoami schreef op 15 december 2003 @ 14:12:
Tja, zorg ervoor dat het item dat je als eerste selecteert een lager nr krijgt dan het item dat je als 2de selecteert.
Hou misschien een apart tellertje oid bij waar je dan op sorteert ipv op sessie-id
ok bedankt :)
had gehoopt dat het anders kon.. lager nummer kan ik het niet geven want het is namelijk een leverancierID.. dus als ik het nummer verander klopt de leverancier weer niet meer
bedankt iig

[ Voor 17% gewijzigd door Sonic op 15-12-2003 14:14 ]


  • chicky
  • Registratie: Augustus 2001
  • Laatst online: 01-06-2025
Het klinnkt misschien stom, maar je kan toch een extra veld maken in de tabel, waar je de tijd/datum inzet van het momoent van invoeren en daar op sorteren :?

  • majornono
  • Registratie: Juni 2002
  • Laatst online: 04-04 23:16
justmental schreef op 15 december 2003 @ 14:12:
Kan niet, dit zul je op moeten lossen buiten SQL.
Het kan wel in SQL. Niet de mooiste oplossing, maar probeer dit maar eens:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SELECT * 
FROM tblAanbod a 
INNER JOIN TblNaw L 
    on L.NawID = a.NawID 
INNER JOIN tbldvd d 
    on a.dvdID = d.dvdID 
WHERE a.AanbodID IN (297)
UNION
SELECT * 
FROM tblAanbod a 
INNER JOIN TblNaw L 
    on L.NawID = a.NawID 
INNER JOIN tbldvd d 
    on a.dvdID = d.dvdID 
WHERE a.AanbodID IN (125)
UNION
SELECT * 
FROM tblAanbod a 
INNER JOIN TblNaw L 
    on L.NawID = a.NawID 
INNER JOIN tbldvd d 
    on a.dvdID = d.dvdID 
WHERE a.AanbodID IN (300)

Problem Exists Between Chair And Keyboard


  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

En als je 20 artikelen in je winkelmand hebt, dan krijg je 20 unions? Lijkt me niet echt elegant.
Maar het kan idd wel ;)

Ik zou zelf voor die 'stomme' oplossing van chicky gaan :)

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:32

.oisyn

Moderator Devschuur®

Demotivational Speaker

sinds wanneer moeten we per se op een kolom sorteren, en kunnen we niet meer onze eigen sorteerwaarden leveren?

SQL:
1
2
3
4
5
6
7
8
SELECT *
FROM tabel
WHERE id IN (123, 456, 789)
ORDER BY CASE id
    WHEN 456 THEN 0
    WHEN 123 THEN 1
    WHEN 789 THEN 2
END


Goed, de vraag is natuurlijk in hoeverre dat efficient is :+

[ Voor 11% gewijzigd door .oisyn op 15-12-2003 16:27 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Huh? Die CASE functie in de ORDER BY levert alleen maar een sortering op, op de geselecteerde kolommen. Dat heeft weer niets te maken met de data in de IN-clause...

:?

Chicky's manier is de enige goede.

:7

[ Voor 12% gewijzigd door Verwijderd op 15-12-2003 16:34 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:14
Verwijderd schreef op 15 december 2003 @ 16:32:
Chicky's manier is de enige goede.

:7
Da's een hele hoop complexiteit toevoegen aan je query, terwijl het bepalen van die volgorde totaal niet de taak is van de DB, enkel het ophalen van de data en het sorteren ervan moet je door SQL laten gebeuren.
(De performance van die query van chicky zal trouwens ook niet zo super zijn, omwille van die complexiteit).
Het is zowiezo beter om een extra tellertje te laten meelopen , en dar dan op sorteren. Daardoor hou je je SQL simpel en snel.

https://fgheysels.github.io/


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:32

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op 15 december 2003 @ 16:32:
Huh? Die CASE functie in de ORDER BY levert alleen maar een sortering op, op de geselecteerde kolommen. Dat heeft weer niets te maken met de data in de IN-clause...
duh, het idee is dat je per index een sorteer-value opgeeft. Dat heeft idd niets te maken met de data in de IN clause, maar het zorgt er wel voor dat je rijen op de goede manier gesorteerd worden. Ik snap je punt dus niet helemaal

[ Voor 4% gewijzigd door .oisyn op 15-12-2003 16:58 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

whoami schreef op 15 december 2003 @ 16:39:
[...]


Da's een hele hoop complexiteit toevoegen aan je query, terwijl het bepalen van die volgorde totaal niet de taak is van de DB, enkel het ophalen van de data en het sorteren ervan moet je door SQL laten gebeuren.
(De performance van die query van chicky zal trouwens ook niet zo super zijn, omwille van die complexiteit).
Het is zowiezo beter om een extra tellertje te laten meelopen , en dar dan op sorteren. Daardoor hou je je SQL simpel en snel.
Raar! Nu stel je zelf voor om een extra tellertje mee te laten lopen. Da's toch precies wat Chicky bedoeld lijkt me. Verder vind ik dit geen complexiteit toevoegen aan een query, maar een tabel uitbreiden om het jezelf makkelijker te maken. En dat kost absoluut geen performance!

:7

Verwijderd

.oisyn schreef op 15 december 2003 @ 16:57:
[...]


duh, het idee is dat je per index een sorteer-value opgeeft. Dat heeft idd niets te maken met de data in de IN clause, maar het zorgt er wel voor dat je rijen op de goede manier gesorteerd worden. Ik snap je punt dus niet helemaal
Je praat over een uiteindelijke resultaat van ORDER BY 0 (of ORDER BY 1, etc). Dat levert mijns inziens alleen maar op dat je op een andere kolomnaam sorteerd. Als je tabel is opgebouwd uit een Id, een naam en een invoerdatum, dan levert ORDER BY 0 op dat je op ID sorteert, ORDER BY 1 geeft een sortering op naam, etc. Dan begrijp ik niet hoe je op die manier je rijen goed sorteerd.

Maarre, ik hou me maar weer koest, want ik zie dat ik met twee moderators aan het discussieren ben...

:7

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

typhon: test het es...

Je kletst namelijk over iets dat je blijkbaar nog nooit zelf gebruikt hebt. De order by sorteert alleen op de xde kolom als er enkel een getal staat, niet als er een functie/complexere zooi staat...
Dan wordt het als kolom-waarde meegenomen (officieel is het niet helemaal toegestaan geloof ik, maar veel SQLproducten implementeren het zo).

.oisyn's antwoord is wel degelijk correct, mits je die query zo op kan bouwen/aan kan leveren.

En mocht .oisyn's antwoord in het specifieke SQLproduct niet werken, maar de query wel zo opgebouwd kunnen worden, dan is het een eitje om er een werkbare query van te maken...
(let op, .oisyn's variant geeft minder overbodige data terug en is daardoor beter)

code:
1
2
3
4
5
6
7
8
9
SELECT *, 
CASE id
    WHEN 456 THEN 0
    WHEN 123 THEN 1
    WHEN 789 THEN 2
END as id_sorter
FROM tabel
WHERE id IN (123, 456, 789)
ORDER BY id_sorter
Pagina: 1