Sql query klopt niet.
Wat ik eigenlijk zou willen is dat ik sorteer op datum in mijn sql query (en dat werkt ook) behalve als een topic "sticky" als status heeft.
Het zou dus op datum gesorteerd moeten worden maar de rows met de status "sticky" moeten als eerste getoond worden (het liefste ook nog op datum).
Hoe gaat zo'n query in zijn werk, ben al een tijd aan het zoeken maar ik kom er niet uit.
ORDER BY ...
sticky DESC,
datum DESC
Ervan uitgaande dat je een datetime veld gebruikt en sticky een 0 (geen sticky) of een 1 (wel een sticky) kan bevatten (integer).
Gewijzigd op 18/04/2011 14:03:21 door Arjan -
Het ligt iets ingewikkelder, namelijk is er een veld waar verschillende waardes in kunnen staan waaronder "Sticky".
Ik heb een veld status en een veld datum.
Ik wil dus dat hij als de status "Sticky" is dat die bovenaan komen (als eerste dus) en daarna alle andere statussen, en dus allemaal op datum gesorteerd.
Is dat ook mogelijk?
ORDER BY Datum ASC / DESC
ORDER BY status WHERE status = 'Sticky', datum
Als ik de WHERE status = 'Sticky' ervoor zet (voor de ORDER BY) dan pakt hij alleen maar de sticky's (logisch) en dat is ook weer niet de bedoeling :)
Gewijzigd op 18/04/2011 16:16:27 door Kees van Norde
Overigens vind ik je status-indeling niet logisch en praktisch werken. Je zou veel eenvoudiger met een simpele int kunnen werken. Bespaart je ook nog is data.
0 = gewoon topic
1 = sticky
2 = gesloten
3 = weet_ik_veel
ORDER BY status DESC/ASC, datum DESC/ASC
Dat werkt niet want dan sorteert hij op alle statussen en hij moet alleen maar de status "Sticky" bovenaan zetten (het liefste ook op datum) en de rest gewoon op datum.
Gewijzigd op 18/04/2011 16:35:09 door Kees van Norde
Opzetje:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT topic, status FROM topics ORDER BY datum
--> result
foreach($result as $topic => $status) {
if($status=='Sticky') {
$aSticky[] = $topic;
}else {
$aOverigeTopics = $topic;
}
}
//output stickys
//output overige
--> result
foreach($result as $topic => $status) {
if($status=='Sticky') {
$aSticky[] = $topic;
}else {
$aOverigeTopics = $topic;
}
}
//output stickys
//output overige
Toevoeging op 18/04/2011 16:44:06:
Of desnoods twee queries, 1tje die alle stickys uit database haalt en sorteert op datum en eentje die de overige ophaalt en sorteer op datum.
(zie je, met ints werken is echt de moeite waard)
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
SELECT
CASE WHEN status = 'Sticky' THEN 1 ELSE 0 END AS sorteer_status
FROM
tabel
ORDER BY
sorteer_status DESC,
datum DESC
CASE WHEN status = 'Sticky' THEN 1 ELSE 0 END AS sorteer_status
FROM
tabel
ORDER BY
sorteer_status DESC,
datum DESC
Gewijzigd op 18/04/2011 16:49:27 door Arjan -
MySQL heeft een specifieke volgorde nodig, anders vreet ie 't niet. Er is hier ook een ezelsbruggetje voor, weet die alleen niet meer uit mijn hoofd.. (blijkt maar hoe slecht ezelsbruggetje het dus is)
Ik heb het nu zo maar dan krijg ik een sql error:
$sTopics = $this->r['sql']->query("SELECT CASE WHEN soort = 'Sticky' THEN 1 ELSE 0 END AS sorteer_status f.*, f.status AS fStatus, l.gebruikersnaam, l.status FROM forum f INNER JOIN profielen l ON l.pid = f.userid WHERE f.fora='".$this->r['key']."' ORDER BY sorteer_status DESC, f.actief DESC LIMIT ".$this->r['navigation']->Make_Beginning_Point().", ".$this->r['cfg']->topics) or die(mysql_error());
Ik heb het gevoel dat we in de buurt zitten maar nog niet helemaal goed :P
En $this->r['sql']->query() :s. r['sql'] lijkt mij een resource of niet?
En welke error krijg je precies?
Ook $this->r['key'] gecontroleerd op onverwachte / niet gewenste waarden? Anders even beveiligen tegen sql injecties.
Edit: Zet achter sorteer_status in je select een komma. Dan zal het goed moeten gaan.
Gewijzigd op 18/04/2011 16:57:59 door Arjan -
Zonder de CASE WHEN soort = 'Sticky' THEN 1 ELSE 0 END AS sorteer_status werkt het wel (maar niet zoals ik wil dus).
Ik vermoed dat ik die code er niet helemaal goed in heb staan.
Sorry voor de leesbaarheid, ik snap dat het normaal op een bepaalde manier gecode wordt zodat het netjes en overzichtelijk is.
Ik heb de code hier compleet achter elkaar geplakt, sorry.
Gewijzigd op 18/04/2011 16:59:15 door Arjan -
Thanks mensen voor de enorme snelle hulp, wat een komma al niet kan doen he :D
En ook bedankt voor de beveiligingstip, hier ga ik naar kijken.
Bedankt!
Gewijzigd op 18/04/2011 17:01:23 door Kees van Norde