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?
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
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 ;