[SQL] "SELECT ... tabel.id IN (6,4,10,2)" sorteer probleem

Pagina: 1
Acties:

  • hlz
  • Registratie: Juni 2003
  • Laatst online: 26-08-2025
Ik wil een aantal records uit een mysql tabel selecteren op basis van hun primary id met de volgende query:

code:
1
SELECT tabel.* FROM tabel WHERE tabel.id IN (6,4,10,2)

Dit werk allemaal prima. Het probleem is nu dat ik de volgorde die ik aangeef (6,4,10,2) graag wil aanhouden in m'n result-set. Mysql denkt daar blijkbaar anders over en sorteert de boel netjes naar 2,4,6,10... Waarschijnlijk heeft dit te maken omdat het id-veld een primary key is :?

Kan iemand mij vertellen hoe ik dit kan oplossen? Het geheel oplossen in php met een loopje van 4 queries is niet echt een lekkere oplossing, omdat het er ook zomaar 8 of 12 kunnen worden...

Overigens doet
code:
1
 WHERE tabel.id = 6 OR tabel.id = 4 OR tabel.id = 10 OR tabel.id = 2

precies hetzelfde. Het resultaat wordt gesorteerd.

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 21-05 14:59

pjvandesande

GC.Collect(head);

Je kan het los selecteren natuurlijk, maar je kan toch ook de data daarna zelf nog sorteren?

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 19-05 21:24

NMe

Quia Ego Sic Dico.

Ik denk dat je toch echt je data zelf moet gaan sorteren, als je een niet-logische, specifieke sortering wil hebben. SQL geeft je in ieder geval de data terug zoals het achtereensvolgens in de database is gezet, dus als je een auto-increment primary key hebt, dan zal dat inderdaad altijd netjes gesorteerd blijven.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Kan je niet sorteren op een andere kolom van je database?

Kan je aangeven waarom je die volgorde wilt hebben? Mischien dat er dan eventueel andere oplossingen mogelijk zijn.

  • MrSleeves
  • Registratie: Februari 2004
  • Laatst online: 10-04 19:23

MrSleeves

You'll thank me later.

Mijn oplossing:

Voeg een kolom toe in de bewuste tabel.
Voor het SELECTen maak je de kolom helemaal leeg.
Vervolgens zet je in de kolom bij de rijen die je wilt hebben en die nummer je in de goede volgorde (6 krijgt 1, 4 krijgt 2, etc..).

Dan een SELECT waarvoor geldt dat de waarde in die kolom >0 (en sorteren).

Ik denk dat dit het enige is om die volgorde te krijgen.

[ Voor 3% gewijzigd door MrSleeves op 29-09-2004 13:49 ]

30Drie Web Design & IT Consultancy | Raven Consultancy Services


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 19-05 21:24

NMe

Quia Ego Sic Dico.

Chief.NET: Ik denk dat dat méér load oplevert dan wanneer je het bijvoorbeeld in een scripting- of programmeertaal probeert op te lossen.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • hlz
  • Registratie: Juni 2003
  • Laatst online: 26-08-2025
Verwijderd schreef op 29 september 2004 @ 13:30:
Kan je niet sorteren op een andere kolom van je database?

Kan je aangeven waarom je die volgorde wilt hebben? Mischien dat er dan eventueel andere oplossingen mogelijk zijn.
Die volgorde van een id's geeft een pad weer naar een node in een boomstructuur.

Om de vraag "waarom ik niet vanuit die node terug omhoog wandel" te voorkomen zal ik er even bij vermelden dat een node niet uniek is binnen de boom. Hij kan dus op meerdere plekker terug komen. En dan krijg ik met de omhoogwandel methode een x aantal paden. Maar dat wil ik hier niet. Ik houd het pad bij dat de gebruiker bewandelt, en dat is dus bijv 2,6,10,4. En om het pad goed weer te geven heb ik dus die nodes in die specifieke volgorde nodig, het liefst in 1 query.

Maar gezien de vorige posts zal ik dus m'n result-array moeten sorteren op tabel.id a.d.v. m'n komma gescheiden pad in PHP. Eens even zien of ik dat kan fixen.

edit:
@chief: dat lijkt me niet zo'n goed plan met 5000 records (nodes) ... ;)

[ Voor 6% gewijzigd door hlz op 29-09-2004 13:53 ]


  • MrSleeves
  • Registratie: Februari 2004
  • Laatst online: 10-04 19:23

MrSleeves

You'll thank me later.

Euhm... tja... beetje jammer :X

Anders wordt het denk ik een tweede tabel eraan hangen en die steeds vullen (en evt. weer legen).

30Drie Web Design & IT Consultancy | Raven Consultancy Services


Verwijderd

Als je geen 'ORDER BY' clausule opgeeft geeft de server in principe de data in willekeurige volgorde terug. Als dat doorgaans er gesorteerd uitziet is dat toeval of de interne werking van de server, maar je mag er eigenlijk niet op rekenen.

Edit: je kan toch ook in PHP de data in de goede volgorde zetten? aangezien je het pad daar ook al weet lijkt me dat redelijk triviaal om te doen.

[ Voor 26% gewijzigd door Verwijderd op 29-09-2004 14:09 ]


  • Robbemans
  • Registratie: November 2003
  • Laatst online: 17-07-2025
Dit kan je oplossen door een extra tabel op te nemen. Je houdt per gebruiker het bewuste ID bij en een volgnummer van dit ID. Je tabel zou er dus als volgt uitzien:

Bezoeken:
USER, ID, VOLGNR

Het ID komt natuurlijk uit de hoofdtabel.

Nu kun je op DEZE tabel seleteren er sorteren op VOLGNR, waarbij je een JOIN legt op je hoofdtabel om de hoofdgegevens eruit te halen:

code:
1
2
3
4
5
6
7
8
9
SELECT HT.*
FROM
  Bezoeken BT
JOIN Hoofdtabel HT ON
  HT.ID = BT.ID
WHERE
  BT.USER = 'user'
ORDER BY
  BT.VOLGNR

[ Voor 13% gewijzigd door Robbemans op 29-09-2004 15:01 ]


  • sjoerdb2
  • Registratie: Juli 2001
  • Laatst online: 09-05-2025
hlz schreef op 29 september 2004 @ 13:15:
Ik wil een aantal records uit een mysql tabel selecteren op basis van hun primary id met de volgende query:

code:
1
SELECT tabel.* FROM tabel WHERE tabel.id IN (6,4,10,2)

Dit werk allemaal prima. Het probleem is nu dat ik de volgorde die ik aangeef (6,4,10,2) graag wil aanhouden in m'n result-set. Mysql denkt daar blijkbaar anders over en sorteert de boel netjes naar 2,4,6,10... Waarschijnlijk heeft dit te maken omdat het id-veld een primary key is :?

Kan iemand mij vertellen hoe ik dit kan oplossen? Het geheel oplossen in php met een loopje van 4 queries is niet echt een lekkere oplossing, omdat het er ook zomaar 8 of 12 kunnen worden...

Overigens doet
code:
1
 WHERE tabel.id = 6 OR tabel.id = 4 OR tabel.id = 10 OR tabel.id = 2

precies hetzelfde. Het resultaat wordt gesorteerd.
Volgens mij kun je ook doen

code:
1
2
3
SELECT tabel.* FROM tabel 
WHERE tabel.id IN (6,4,10,2) 
ORDER BY tabel.id=6 DESC, tabel.id=4 DESC, tabel.id=10 DESC, tabel.id=2 DESC

[ Voor 4% gewijzigd door sjoerdb2 op 29-09-2004 14:47 ]


  • Robbemans
  • Registratie: November 2003
  • Laatst online: 17-07-2025
sjoerdb schreef op 29 september 2004 @ 14:24:
[...]


Volgens mij kun je ook doen

code:
1
2
3
SELECT tabel.* FROM tabel 
WHERE tabel.id IN (6,4,10,2) 
ORDER BY tabel.id=6 DESC, tabel.id=4 DESC, tabel.id=10 DESC, tabel.id=2 DESC
Hoe dynamisch kun je hem maken? Dit wordt een draak van een query... (No flame intended!)

[ Voor 5% gewijzigd door Robbemans op 29-09-2004 14:53 ]


  • DaCoTa
  • Registratie: April 2002
  • Laatst online: 21-05 22:50
edit:
Niet goed gelezen

[ Voor 90% gewijzigd door DaCoTa op 29-09-2004 14:59 ]


  • sjoerdb2
  • Registratie: Juli 2001
  • Laatst online: 09-05-2025
Robbemans schreef op 29 september 2004 @ 14:52:
[...]


Hoe dynamisch kun je hem maken? Dit wordt een draak van een query... (No flame intended!)
tsja, zoiets smerigs dan maar :)
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$records = "6,4,10,2";

$query = "SELECT tabel.* FROM tabel WHERE tabel.id IN (".$records;
$recordarray = explode(",",$records);
$query .= ") ORDER BY";

for ($i=0;$i<sizeof($recordarray);$i++) {
    
    $query .= " tabel.id=".$recordarray[$i]." DESC";
     if ($i < sizeof($recordarray) -1 ) {
     $query .= ",";
     }
    }
?>

  • DaCoTa
  • Registratie: April 2002
  • Laatst online: 21-05 22:50
Volgens mij is het oplossen in php makkelijker en sneller dan oplossen door een barrage aan order by queries. Een lookup table tussen originele volgorde en results is toch niet zo moeilijk?

  • hlz
  • Registratie: Juni 2003
  • Laatst online: 26-08-2025
Mensen, bedankt voor alle reacties... werken met een ander probleem in je hoofd zuigt, maar heb even de tijd gevonden dit op te lossen.

Heb het met PHP opgelost. Namelijk zo:
De records uit mysql met die IN-select in een array-tje gestopt met als key de tabel.id-waarde (die is immers uniek). Dan over het array-tje met de pad-nodes (zelfde keys) lopen en de data uit het mysql arraytje ermee displayen.

Erg simpel, maar omdat ik normaal een standaard sql-2-array functie aanroep die arrays maakt met keys van 0 tot x heb ik daar ff niet zo snel aan gedacht... :Z
Pagina: 1