2009-07-05 12 views
3

Je table "tâches" avec 3 champs:Tri sélectif dans MySQL?

  1. Date
  2. priorité (0,1,2)
  3. done (0,1)

Ce que je suis en train de atteindre est avec la table entière triée par le drapeau done, les tâches qui ne sont pas effectuées doivent être triées par priorité, tandis que les tâches qui sont effectuées doivent être triées par date:

  1. Select * de tâches commande par fait asc
  2. Si done = 0 plus l'ordre par priorité desc
  3. Si done = 1 plus par ordre chronologique desc

Est-il possible de le faire dans MySQL sans syndicats?

Merci.

Répondre

12

Vous pouvez essayer ORDER BY (done asc, aux desc) où aux est calculé avec un CASE pour obtenir soit la priorité ou la date en fonction de la valeur de done (vous pouvez avoir à les jeter au même type pour tenir dans la même expression, par exemple jeter la date à un nombre de jours entier approprié).

Par exemple:

SELECT * FROM tab 
ORDER BY done desc, 
     case done 
      when 0 then prio 
      else to_days(thedate) 
     end desc; 
+0

Merci, qui fonctionne (même sans TO_DAYS) – serg

+0

Ah , Je suppose que MySQL est en train de diffuser automatiquement - ah, eh bien, c'est toujours difficile de deviner où MySQL va lancer et où ça ne sera pas! -) –

7

Tiré de Alex Martelli juste raccourcies un peu avec IF() et fixé l'ASC/DESC commande

SELECT * FROM tab 
ORDER BY done ASC, IF(done, to_days(thedate), prio) DESC;