Sorteren op Enum

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Citroen Anoniem Graag

Citroen Anoniem Graag

10/11/2007 21:30:00
Quote Anchor link
Hi There:)

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

PHP hulp

23/11/2024 13:31:38
 
Frank -

Frank -

12/11/2007 01:55:00
Quote Anchor link
Dat gaat niet, dat is ook 1 van de problemen met een ENUM. Je kunt beter een aparte tabel met statussen aanmaken en deze met een foreignkey koppelen aan de tabel 'topics'.

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)
PHP script in nieuw venster Selecteer het PHP script
1
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;
"
;
?>

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 -
 
Citroen Anoniem Graag

Citroen Anoniem Graag

12/11/2007 12:59:00
Quote Anchor link
Inderdaad een goed idee om een andere tabel aan te maken. Ik heb gewoon de Enum volgorde aangepast en dat is natuurlijk geen nette oplossing.
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.
 
Frank -

Frank -

12/11/2007 13:30:00
Quote Anchor link
Quote:
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.
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.

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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
ORDER BY
  status.sort_order ASC,
  topics.datumveld DESC
 
Citroen Anoniem Graag

Citroen Anoniem Graag

12/11/2007 22:17:00
Quote Anchor link
Ik heb een apparte tabel met statussen en volgorde-id maar dit is wat ik wil bereiken:

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

Crispijn -

12/11/2007 22:20:00
Quote Anchor link
Wat is je volledige query tot nu toe? Dan kunnen we gaan puzzelen...
 
Joren de Wit

Joren de Wit

12/11/2007 22:31:00
Quote Anchor link
Er klopt nog iets niet helemaal in je datamodel. Of een topic sticky is, is namelijk een andere soort status dan actief, gesloten of verwijderd. Je kunt immers ook gesloten sticky topics hebben en dat is op dit moment onmogelijk in je datamodel.

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.
 
Citroen Anoniem Graag

Citroen Anoniem Graag

13/11/2007 12:35:00
Quote Anchor link
Ik moet het dus zo doen:

Een tabel met topics

Topics
id
m_id
c_id
s_id
t_id

Statussen
id
status

type
id
type
 
Joren de Wit

Joren de Wit

13/11/2007 12:37:00
Quote Anchor link
Bijvoorbeeld. Maar als je maar 1 soort type hebt, is die tabel natuurlijk overbodig...
 
Frank -

Frank -

13/11/2007 12:48:00
Quote Anchor link
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.
 
Joren de Wit

Joren de Wit

13/11/2007 13:13:00
Quote Anchor link
@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...
 



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.