8720 sujets

Développement web côté serveur, CMS

Bonjour,

J'ai une base MySQL énumérant une liste de banques. Deux champs m'intéressent pour les classer, à savoir "banque_sortie" qui est un champ de type "DATE" et "banque_designation" qui est un champ de type "CHAR".

Je souhaite dans un premier temps afficher toutes les banques dont la date de sortie est Null ou supérieure à la date du jour, ensuite organiser les banques par désignation et enfin mettre les banques dont la date de sortie est inférieure ou égale à la date du jour à la fin.

J'ai bien tenté ceci ainsi que d'autres méthodes mais ça n'a pas fonctionné, et je commence à m'emmêler :


ORDER BY banque_sortie IS NULL OR banque_sortie > "'.date('Y-m-d').'", banque_designation AS


Si quelqu'un à une solution ... Smiley confused
Merci d'avance Smiley smile
Pour faire simple, tu pourrais demander le tri sur deux critères, tout simplement :
order by date desc, designation

On demande un tri par date décroissante, donc les entrées qui sont dans le futur ou celles d'aujourd'hui apparaîtront forcément avant ceux d'hier ou ou plus anciens. Si la date est identique alors on trie selon le second critère.

Le problème c'est les null. Ce n'est pas très malin d'avoir à trier sur une colonne qui peut contenir null, ça serait à éviter parce que ça complique inutilement, mais bon, on ne choisit pas toujours. Je vois deux possibilités :

1 - Utiliser une colonne fake
select ..., date is null as sortcol ... order by sortcol desc, date desc, designation
Is null renvoie 1 ou 0, donc les null passeront avant tous les autres.

2 - OU sinon, plus tordu, palier à cette présence de null en les supprimant :
select ... coalece(date, now()) as date2 ... order by date2 desc, designation

Je ne suis plus 100% sûr de l'ortohgraphe du nom de cette fonction, mais je suis certain pour l'avoir déjà utilisée quelque part qu'il en existe une avec un nom très similaire dont le rôle est de renvoyer le premier argument non nul passé. Ici si date est null, ça renvoie le retour de now() donc aujourd'hui. Vu qu'on trie priotairement par date décroissante, ceux d'aujourd'hui apparaîtront en premier. A la place de now() tu peux aussi mettre une date très loin dans le futur pour être sûr qu'ils apparaissent vraiment en premier, ex. 2099-12-31.