Sql query klopt niet.

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Kees van Norde

Kees van Norde

18/04/2011 14:00:06
Quote Anchor link
Ik ben bezig met een forum en ik kom niet helemaal uit een sorteer query.

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 ...
 
PHP hulp

PHP hulp

19/12/2024 16:20:15
 
Arjan -

Arjan -

18/04/2011 14:01:31
Quote Anchor link
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 -
 
Write Down

Write Down

18/04/2011 14:01:42
Quote Anchor link
ORDER BY field1 DESC/ASC, field2 DESC/ASC

Arjan is me voor :-)
Gewijzigd op 18/04/2011 14:02:32 door Write Down
 
Kees van Norde

Kees van Norde

18/04/2011 16:00:43
Quote Anchor link
Bedankt voor jullie reacties!

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?
 
Wesley PHP

Wesley PHP

18/04/2011 16:08:36
Quote Anchor link
WHERE Status = 'Sticky'
ORDER BY Datum ASC / DESC
 
Kees van Norde

Kees van Norde

18/04/2011 16:14:34
Quote Anchor link
Deze werkt niet (ik zal vast iets verkeerd doen).

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
 
Write Down

Write Down

18/04/2011 16:31:53
Quote Anchor link
ORDER NY status DESC/ASC, datum DESC/ASC ?

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
 
Kees van Norde

Kees van Norde

18/04/2011 16:34:41
Quote Anchor link
Ik begrijp wat je bedoelt, maar inmiddels is het zoveel gescript al dat ik dat niet meer wil aanpassen.

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
 
Write Down

Write Down

18/04/2011 16:41:55
Quote Anchor link
Dan vrees ik dat je in PHP nog een ommetje moet doen.

Opzetje:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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



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)
 
Arjan -

Arjan -

18/04/2011 16:45:30
Quote Anchor link
Je kan het ook zo doen (lijkt mij efficiënter ;) ):

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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
Gewijzigd op 18/04/2011 16:49:27 door Arjan -
 
Gerben Jacobs

Gerben Jacobs

18/04/2011 16:49:58
Quote Anchor link
ORDER BY komt altijd achteraan.

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)
 
Kees van Norde

Kees van Norde

18/04/2011 16:53:41
Quote Anchor link
Hoi,

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
 
Arjan -

Arjan -

18/04/2011 16:55:34
Quote Anchor link
Gebruik even code tags en zet alles even iets leesbaarder neer!

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 -
 
Kees van Norde

Kees van Norde

18/04/2011 16:57:57
Quote Anchor link
Hoi,

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.
 
Arjan -

Arjan -

18/04/2011 16:58:22
Quote Anchor link
Zie mijn edit in de vorige post... De mysql error geeft aan waar je fout zit (NEAR....)
Gewijzigd op 18/04/2011 16:59:15 door Arjan -
 
Kees van Norde

Kees van Norde

18/04/2011 17:00:46
Quote Anchor link
Hij werkt :D

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
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.