[APS / SQL] Sorteren maar dan niet op alfabet

Pagina: 1
Acties:

  • Urk
  • Registratie: Maart 2000
  • Laatst online: 27-05 15:46
Heb al gezocht in ASP en SQL boeken en op GoT maar kom er niet uit...

Ik heb simpele query waarin ik uit een tabel een lijst wil halen van 6 regio's!
Als de user inlogt in de site haalt hij uit de user tabel zijn default regio!

Nu heb ik na het inloggen een multiple select box waarin alle regio's staan, echter moet de regio van de user altijd bovenaan staan, daarna de rest op alfabetisch volgorde.

Stel dus dat een User uit Regio EMEA inlogt dan moet er in de SELECT box het volgende komen

EMEA --> bovenaan
APAC
CANADA
USA

Als iemand uit Canada inlogt moet Canada bovenaan staan. Daarna de andere regio's op alfabet..

Kan ik dat in SQL doen of moet ik een speciaal truckje in ASP uithalen?
Heeft iemand enig idee?? _/-\o_ _/-\o_

  • André
  • Registratie: Maart 2002
  • Laatst online: 26-05 00:33

André

Analytics dude

Met SQL betekent dat 2 queries.

Beter is het om hem tijdens het schrijven van de pagina de status selected te geven en als de pagina geladen is bovenaan te zeten mbv javascript.

[ Voor 5% gewijzigd door André op 30-01-2004 10:36 ]


  • DeverauX
  • Registratie: Februari 2002
  • Niet online

DeverauX

Focus is everything

De betreffende regio gewoon opslaan in een session of cookie. (en deze vervolgens uitlezen) :)

...whatever was distasteful or unpleasant or uncomfortable or painful - music could always soothe that.
All you have to do is reach out to beauty.
Quincy Jones


  • kvdveer
  • Registratie: November 2000
  • Laatst online: 06-11-2025

kvdveer

Z.O.Z.

André: Je doet je ondertitel wel eer aan... Een JS oplossing.

Urk: Ik weet niet exact hoe het in jou DBMS moet (welke is dat?) Maar ik mysql kan het als volgt:

code:
1
2
3
4
SELECT *, regio <> 'EUR' as vergelijking
FROM tabel
WHERE [where]
ORDER BY vergelijking, regio

Wat ik doe: Ik vergelijk de regio met EUR. Daaruit komt TRUE als het NIET Europa is, anders komt er FALSE uit. FALSE sorteert voor TRUE in mysql, dus komt europa bovenaan.

[ Voor 4% gewijzigd door kvdveer op 30-01-2004 10:40 ]

Localhost, sweet localhost


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
SQL Server:

code:
1
2
SELECT region FROM Regions 
ORDER BY CASE region WHEN @userregion THEN 1 else 2 END


waarbij @userregion een parameter is die (duh) de region van de user bevat. Zoiets moet werken

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


  • Urk
  • Registratie: Maart 2000
  • Laatst online: 27-05 15:46
kvdveer schreef op 30 januari 2004 @ 10:40:
André: Je doet je ondertitel wel eer aan... Een JS oplossing.

Urk: Ik weet niet exact hoe het in jou DBMS moet (welke is dat?) Maar ik mysql kan het als volgt:

code:
1
2
3
4
SELECT *, regio <> 'EUR' as vergelijking
FROM tabel
WHERE [where]
ORDER BY vergelijking, regio

Wat ik doe: Ik vergelijk de regio met EUR. Daaruit komt TRUE als het NIET Europa is, anders komt er FALSE uit. FALSE sorteert voor TRUE in mysql, dus komt europa bovenaan.
Ik gebruik Microsoft SQL Server 2000, zou bovenstaande daarin ook kunnen?
je hebt dan toch alleen in deze regel:
SELECT *, regio <> 'EUR' as vergelijking
toch ook al een soort WHERE zitten? Kan dat gewoon??

  • Urk
  • Registratie: Maart 2000
  • Laatst online: 27-05 15:46
Ik heb nu deze query in MS SQL:

ASP:
1
2
3
4
SELECT *, region_id <> 1 as vergelijking
FROM Region, UserRegions
WHERE regionid=region_id AND userid = 1
ORDER BY vergelijking, region_name 


Maar dit werkt niet -->

"Incorrect syntax near <"
Dit kan wellicht niet in MS SQL?

[ Voor 8% gewijzigd door Urk op 30-01-2004 10:59 . Reden: layout ]


  • Urk
  • Registratie: Maart 2000
  • Laatst online: 27-05 15:46
André schreef op 30 januari 2004 @ 10:35:
Met SQL betekent dat 2 queries.

Beter is het om hem tijdens het schrijven van de pagina de status selected te geven en als de pagina geladen is bovenaan te zeten mbv javascript.
Ja helaas kan ik de status selected niet geven want de regio kan namelijk niet geselecteerd worden, alleen de landen binnen de regio.
De region is ook een

HTML:
1
<optgroup label="regionaam">


dus niet selectable

EDIT:
Wellicht kan ik wel het eerste land binnen zijn regio geselecteerd zetten, die moet ik dan even ophalen uit een Request.Form..
Is misschien ook nog niet zo'n slecht idee.. Maar zijn er toch nog mensen die weten hoe het werk binnen SQL zelf?

[ Voor 22% gewijzigd door Urk op 30-01-2004 11:07 ]


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Urk schreef op 30 januari 2004 @ 10:58:

Dit kan wellicht niet in MS SQL?
Bovenstaande gaat niet lukken in SQL Server, heb je mijn suggestie al geprobeerd?

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


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
En mocht het echt niet lukken kan je het nog altijd met een union doen ook

code:
1
2
3
4
SELECT 0, regio FROM regios WHERE regio = 'blaat'
UNION
SELECT 1, regio FROM regios WHERE regio <> 'blaat'
ORDER BY 1, regio


Maar echt performant zal dit niet zijn vermoed ik.

https://fgheysels.github.io/


  • Urk
  • Registratie: Maart 2000
  • Laatst online: 27-05 15:46
P_de_B schreef op 30 januari 2004 @ 11:06:
[...]

Bovenstaande gaat niet lukken in SQL Server, heb je mijn suggestie al geprobeerd?
Ja wel mee bezig geweest, maar tot nu toe ook alleen foutmeldingen, heb het volgende:

ASP:
1
2
3
4
5
6
sqlString = "SELECT region_name, region_id
FROM Region, UserRegions
ORDER BY CASE region_id
WHEN " & Session("hpglobal_region") & " THEN 1 else 2 END
WHERE regionid=region_id AND userid = " & Session("hpglobal_userid") & " 
ORDER BY region_name"


Heb alleen geen idee wat ik bij THEN 1 Else 2 END moet doen.
Kan ik daar een ORDER BY ofzo doen??

[ Voor 8% gewijzigd door Urk op 30-01-2004 11:15 ]


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Dit lijkt niet eens op geldig SQL. Je hebt 2 ORDER BY clausules.

code:
1
2
3
sqlString = "SELECT region_name, region_id FROM Region
ORDER BY CASE region_Id WHEN " 
& Session("hpglobal_region") & " THEN 1 ELSE 2 END"


wil je daarna wel op alfabet sorteren (dus in mijn geval:

Europa
Afrika
Amerkia
Australie
Azie

kun je het volgende doen:

code:
1
2
3
sqlString = "SELECT region_name, region_id FROM Region
ORDER BY CASE region_Id WHEN " 
& Session("hpglobal_region") & " THEN 1 ELSE 2 END, region_name"


Je moet juist niet joinen met de gebruikerstabel.

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


  • DeverauX
  • Registratie: Februari 2002
  • Niet online

DeverauX

Focus is everything

* DeverauX is confused

Nadat een user ingelogd is, en zijn/haar region bekend is moet deze bovenaan je keuzelijst komen te staan?
Het kan aan mij liggen hoor, maar dan snap ik niet zo goed waarom dit perse in je query moet gebeuren.
Ten eerste is SQL niet voor het verzorgen van de presentatie van de data, en daarnaast lijkt het me (m.b.t. de performance) beter de region gewoon in een session/cookie vast te leggen, en deze vervolgens te gebruiken. :)

Mits iemand ingelogd is hoef je dan alleen een SELECT te draaien die alle regions ophaalt, met uitzondering van die die in de session/cookie is vastgelegd, en je vult de eerste waarde van je keuzelijst met die uit de session en de rest met die uit de query gesorteerd op alfabet. :)

...whatever was distasteful or unpleasant or uncomfortable or painful - music could always soothe that.
All you have to do is reach out to beauty.
Quincy Jones


  • Urk
  • Registratie: Maart 2000
  • Laatst online: 27-05 15:46
DeverauX schreef op 30 januari 2004 @ 11:31:
* DeverauX is confused

Nadat een user ingelogd is, en zijn/haar region bekend is moet deze bovenaan je keuzelijst komen te staan?
Het kan aan mij liggen hoor, maar dan snap ik niet zo goed waarom dit perse in je query moet gebeuren.
Ten eerste is SQL niet voor het verzorgen van de presentatie van de data, en daarnaast lijkt het me (m.b.t. de performance) beter de region gewoon in een session/cookie vast te leggen, en deze vervolgens te gebruiken. :)

Mits iemand ingelogd is hoef je dan alleen een SELECT te draaien die alle regions ophaalt, met uitzondering van die die in de session/cookie is vastgelegd, en je vult de eerste waarde van je keuzelijst met die uit de session en de rest met die uit de query gesorteerd op alfabet. :)
Ja ok, daar zou ik ook nog iets mee kunnen proberen, en anders 2 query's draaien!
Tnx!!

  • Urk
  • Registratie: Maart 2000
  • Laatst online: 27-05 15:46
P_de_B schreef op 30 januari 2004 @ 11:30:
[...]


Dit lijkt niet eens op geldig SQL. Je hebt 2 ORDER BY clausules.

code:
1
2
3
sqlString = "SELECT region_name, region_id FROM Region
ORDER BY CASE region_Id WHEN " 
& Session("hpglobal_region") & " THEN 1 ELSE 2 END"


wil je daarna wel op alfabet sorteren (dus in mijn geval:

Europa
Afrika
Amerkia
Australie
Azie

kun je het volgende doen:

code:
1
2
3
sqlString = "SELECT region_name, region_id FROM Region
ORDER BY CASE region_Id WHEN " 
& Session("hpglobal_region") & " THEN 1 ELSE 2 END, region_name"


Je moet juist niet joinen met de gebruikerstabel.
Thanks! Jouw query werkt perfect! Ik heb nu als query (al gemerged):

ASP:
1
2
3
4
SELECT region_name, region_id
FROM Region, UserRegions
WHERE regionid=region_id AND userid = 1
ORDER BY CASE region_Id WHEN 1 THEN 1 ELSE 2 END, region_name 


Dus ik heb hem wel gejoined! Want dat is wel nodig, als 1 user 1 regio niet heeft moet hij die ook niet laten zien. Jij zei dat ik niet moest joinen, maar heb het zoals hierboven gedaan en werkt voor zover ik nu kan ziet helemaal PERFECT! _/-\o_

  • Urk
  • Registratie: Maart 2000
  • Laatst online: 27-05 15:46
Oh ja, nog een vraagje:
Wat doet dit nou precies?? -->

ORDER BY CASE region_Id WHEN 1 THEN 1 ELSE 2 END

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Urk schreef op 30 januari 2004 @ 13:59:
[...]


Thanks! Jouw query werkt perfect! Ik heb nu als query (al gemerged):

ASP:
1
2
3
4
SELECT region_name, region_id
FROM Region, UserRegions
WHERE regionid=region_id AND userid = 1
ORDER BY CASE region_Id WHEN 1 THEN 1 ELSE 2 END, region_name 


Dus ik heb hem wel gejoined! Want dat is wel nodig, als 1 user 1 regio niet heeft moet hij die ook niet laten zien . Jij zei dat ik niet moest joinen, maar heb het zoals hierboven gedaan en werkt voor zover ik nu kan ziet helemaal PERFECT! _/-\o_
Mooi! ik ben blij dat het werkt :)

De case when constructie doet niets anders als een 'volgorde' toewijzen aan elk record. Als de region_id overeenkomt met de gewenste region_id wordt het nummer 1 gebruikt om te sorteren, anders nummer 2.

Voor een duidelijker uitleg kun je het best even kijken in BooksOnline naar wat CASE WHEN doet.

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


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Urk schreef op 30 januari 2004 @ 13:59:
Oh ja, nog een vraagje:
Wat doet dit nou precies?? -->

ORDER BY CASE region_Id WHEN 1 THEN 1 ELSE 2 END
Je geeft nu MSSQL 2 waarden om te sorteren... aan de userwaarde ken je een lagere waarde toe en die komt dus bovenaan.
Hij ordent nu dus niet op region id maar op een virtueel veld met de waardes 1 of 2 afhankelijk van de case.

Ik beschrijf het effect, niet zozeer de gekozen implementatie van MSSQL want wie kent die nou :)

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
bigbeng schreef op 30 januari 2004 @ 14:09:
[...]
niet zozeer de gekozen implementatie van MSSQL want wie kent die nou :)
:?

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


  • Urk
  • Registratie: Maart 2000
  • Laatst online: 27-05 15:46
bigbeng schreef op 30 januari 2004 @ 14:09:
[...]


Je geeft nu MSSQL 2 waarden om te sorteren... aan de userwaarde ken je een lagere waarde toe en die komt dus bovenaan.
Hij ordent nu dus niet op region id maar op een virtueel veld met de waardes 1 of 2 afhankelijk van de case.

Ik beschrijf het effect, niet zozeer de gekozen implementatie van MSSQL want wie kent die nou :)
Hmmm....thanks! Ik snap het wel een beetje maar het is toch nog best lastig om goed te begrijpen :D
Pagina: 1