[MySQL] Simpele ORDER BY met WHERE ... IN

Pagina: 1
Acties:

  • nl2dav
  • Registratie: Juni 2001
  • Laatst online: 06:41
Ik dacht een heel simpel probleem te hebben maar het is ingewikkelder dan ik dacht. Ik heb een query als volgt;

code:
1
2
3
4
SELECT categories_name
FROM `categories`
WHERE categories_id
IN ( 43, 23, 381 )


Ik wil dus de rijen hebben waarbij categories_id de waarde 43, 23 of 381 bevat. Gaat prima, alleen krijg ik de inhoud terug als 23, 43 en 381... Verkeerd gesorteerd dus. Terwijl ik gewoon wil dat de ordering aangehouden wordt zoals ik in de query heb staan. Niet van groot naar klein of van klein naar groot maar gewoon als het hierboven staat.

Nu heb ik wel wat afgezocht en in de manual zitten lezen maar ik lees er blijkbaar overheen ofzo? Het vervelende is dat "IN" een nogal veelgebruikt woordje is en het erg lastig zoeken is....

Nu heb ik wel al een oplossing hoor;
SELECT categories_id
FROM `categories`
WHERE categories_id
IN ( 43, 23, 381 )
ORDER BY CASE categories_id
WHEN '43'
THEN 1
WHEN '23'
THEN 2
WHEN '381'
THEN 3
ELSE 999
END LIMIT 0 , 30
Maar dat lijkt me een tikkeltje overdreven?

Q350+ComfoClime24 Ubbink aerfoam / Air Excellent & Renson Easyflex


Verwijderd

Volgens mij moet je een extra kolom in jouw tabel bijhouden,
bijvoorbeeld categories_sortorder

Je geeft de juiste categories_id de juiste categories_sortorder

Daarna geef je in jouw query ook nog eens mee:

ORDER BY `categories_sortorder`

Verwijderd

Heb eens hetzelfde probleem gehad en toen was de oplossing die je zelf aandraagt ook hetgeen wat ik heb gebruikt. Op zich werkt het uitstekend en ik neem aan dat je de query door een scriptje laat opbouwen, dus zoveel negatieve argumenten voor het gebruik van een CASE statement kan ik niet opnoemen.

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Als je met php werkt en geen extra kolom aan de DB wil toevoegen, dan kun je eens array_multisort proberen om de array met de resultaten te sorteren volgens de volgorde van de array met de ID's.

  • nl2dav
  • Registratie: Juni 2001
  • Laatst online: 06:41
Ik wil inderdaad geen extra kolom toevoegen omdat het een bestaand open source project is en ik niet teveel wil afwijken van de nu huidige structuur. Al zou deze kolom wel zinnig zijn in mijn ogen maar dat is aan de developers :) .

Opzich is de oplossing die ik zelf al aangedragen had niet verkeerd maar vond en vind hem niet echt mooi (wordt heel lelijk als je bij wijze van spreken 50 values wil hebben). Sorteren door PHP had ik ook wel aan gedacht maar vond dat het via SQL ook eenvoudig moest kunnen aangezien ik zelf eigenlijk al aangeef hoe ik de resultset wil hebben in de query.

Nouja jammer dat het waarschijnlijk niet netter kan, ga ik hier maar verder mee aan de slag :|

Mocht er toch iemand zijn die het korter kan krijgen dan hou ik me aanbevolen ;)
(ORDER BY id IN (6,7,3,2,1)) werkt helaas niet wat ik opzich logisch zou vinden, maarrrja :X

[ Voor 9% gewijzigd door nl2dav op 01-11-2006 10:08 ]

Q350+ComfoClime24 Ubbink aerfoam / Air Excellent & Renson Easyflex