web-dev-qa-db-fra.com

Comment utiliser un ORDER BY conditionnel dans MySQL?

J'ai les cours de table où nous avons quelques champs et aussi le champ course(string), favorited(bool), favoritedDate(dateTime), dateUpload.

L'enseignant télécharge le cours et cette date est stockée dans le champ dateUpload. Si l'enseignant marque ce cours comme favori, cette information est un numéro 1 dans le champ favorited et la date à laquelle il a été marqué est stockée dans le champ favoritedDate.

Maintenant, je dois récupérer tous les cours d'un enseignant spécifique, puis ordonner la liste par date: si le cours est marqué favorited=1 doit être commandé par favoritedDate,dateUpload desc, si favorited=0 ne doit être commandé que par dateUpload desc.

C'est ce que j'ai jusqu'à présent mais cela ne fonctionne pas:

SELECT * from courses where teacherId = 23 
ORDER BY 
  CASE favorited WHEN 1 THEN favoritedDate, dateUpload
    else dateUpload
  END
  DESC
;

Aucune idée sur la façon de résoudre ça?

5
zwitterion

Une expression de cas retourne une valeur atomique donc vous ne pouvez pas retourner:

favoritedDate, dateUpload

Je pense que cela fera ce que vous voulez:

ORDER BY
    CASE favorited WHEN 1 THEN favoritedDate 
                          ELSE dateUpload 
    END DESC, dateUpload
5
Lennart

Comme l'explique Lennart, une expression CASE dans MySQL ne peut produire qu'une seule valeur, pas deux ou plus. Je pense que cela répondrait à votre problème:

ORDER BY
    CASE WHEN favorited = 1 THEN 0 ELSE 1 END,
    CASE WHEN favorited = 1 THEN favoritedDate END,
    dateUpload DESC ;

Si les valeurs favoritedDate sont NULL lorsque l'élément n'est pas "mis en favoris", alors vous n'avez vraiment pas besoin de la colonne favorited. Les informations sont stockées dans favoritedDate: si elle est nulle, ce n'est pas un favori. Si ce n'est pas nul, ça l'est. Le ORDER BY dans ce cas (pas beaucoup plus simple, car MySQL trie les valeurs nulles avant les valeurs non nulles):

ORDER BY
    (favoritedDate IS NULL),
    favoritedDate,
    dateUpload DESC ;
4
ypercubeᵀᴹ