Sorteren op Enum
Ik heb een enum veld in de database:
enum('sticky', 'actief', 'gesloten', 'verwijderd');
En nu heb ik deze query:
$qTopics = "SELECT id, titel FROM topics WHERE c_id = ".mysql_real_escape_string($_POST['cid'])." ORDER BY status, datum DESC;";
De bedoeling is dat hij eerst op status gesorteerd, dwz sticky boven aan enz. en daarna op datum.
Maar hoe doe je dat?
Alvast bedankt
Edit:
Ik post de oplozing hier gewoon zelf :S Op de verkeerde locatie opgeslagen...
Gewijzigd op 01/01/1970 01:00:00 door Citroen Anoniem Graag
Zie ook de MySQL-handleiding, daar staat ook in beschreven dat er 1 vaste sortering is voor ENUMs, de volgorde waarin je ze hebt opgeslagen.
Offtopic: Schrijf je queries netjes en volledig uit:
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
<?
$qTopics = "
SELECT
id,
titel
FROM
topics
WHERE
c_id = ".mysql_real_escape_string($_POST['cid'])."
ORDER BY
status ASC,
datum DESC;
";
?>
$qTopics = "
SELECT
id,
titel
FROM
topics
WHERE
c_id = ".mysql_real_escape_string($_POST['cid'])."
ORDER BY
status ASC,
datum DESC;
";
?>
Ook al is ASC default, het scheelt bugs wanneer je deze gewoon altijd netjes noteert.
Gewijzigd op 01/01/1970 01:00:00 door Frank -
De queries schrijf ik altijd volledig uit tijdens het debuggen, daarna zet ik het allemaal weer op enkele regels anders wordt mijn code zo onveroverzichtelijk.
Maar nu een andere vraag: is het mogelijk om met 1 query de berichten zo te sorteren dat de topics met sticky-status boven aan komen en dat hij verder gewoon op datum sorteert.
NB: Ik gebruik nu een aparte tabel voor statussen.
Quote:
Dubbel werk, dubbel risico op bugs en je wint er helemaal niks mee... Hele vreemde aanpak, zeker omdat je code er juist overzichtelijker van wordt, een query is in 1 oogopslag te lezen en te begrijpen, wat heel handig is bij onderhoud.De queries schrijf ik altijd volledig uit tijdens het debuggen, daarna zet ik het allemaal weer op enkele regels anders wordt mijn code zo onveroverzichtelijk.
Dan de query: Wanneer jij de statussen in een bepaalde volgorde wilt hebben, zul je in de tabel met statussen een sort_order moeten opgeven. Vervolgens kun je sorteren op deze kolom en op datum:
Alle topics selecteren: met boven aan de sticky topics (op dat gesorteerd dwz nieuwste boven aan) en daarna alle topics (gesloten en actief) op datum gesoorteerd met laatste reactie boven aan, en verwijderde topics mogen er niet tussen staan.
Dat laaste is niet zo moeilijk WHERE s.status != 'verwijderd' het sorteren op datum ook geen probleem, maar dat de actieve en gesloten topics gewoon door elkaar heen kunnen staan dat wil niet echt lukken...
Ik hoop dat er wordt begrepen wat ik bedoel.
Begin toch ernstig te twijfelen of dit mogelijk is.... als ik het volgorde-id het zelfde maakt werkt dat niet, komt denk ik omdat hij daarna automatisch op id sorteerd....
Gewijzigd op 01/01/1970 01:00:00 door Citroen Anoniem Graag
Wat is je volledige query tot nu toe? Dan kunnen we gaan puzzelen...
Kortom, ik zou de status tabel gebruiken om onderscheid te maken tussen actieve, gesloten en verwijderde topics. Daarnaast zou ik in de topics tabel een extra kolom opnemen die aangeeft of een topic sticky is of niet.
Mocht je ook andere statussen hebben (bijv. supersticky, nieuwsbericht) dan krijg je hier natuurlijk ook weer een aparte tabel voor.
Een tabel met topics
Topics
id
m_id
c_id
s_id
t_id
Statussen
id
status
type
id
type
Bijvoorbeeld. Maar als je maar 1 soort type hebt, is die tabel natuurlijk overbodig...
De tabel Statussen heeft geen kolom waarin je de sorteervolgorde opslaat. Nu kun je dus nooit sorteren, behalve alfabetisch of op een onzinnig id die geen enkele betekenis heeft. Er mist dus een kolom.
@Frank: dat is nu waarschijnlijk niet meer nodig. Of de TS moet ook nog in een bepaalde volgorde willen kunnen sorteren op 'actief', 'gesloten' en 'verwijderd'. Maar daar zie ik persoonlijk niet echt het nut van in...