web-dev-qa-db-fra.com

La commande de blog de catégorie ne fonctionne pas

J'avais une question sur l'ordre de classement des catégories de blogs, j'ai beaucoup d'articles de novembre, mais la dernière fois, j'ai ajouté beaucoup d'articles via une API d'août. L'import était tout bon et rien n'était faux, mais lorsque j'ai réglé la mise en page de mon blog sur "Le plus récent en premier", sa date de novembre et août est la plus récente.

Je reçois:

30 novembre 30 août 23 novembre 22 août

Mais je veux avoir:

30 novembre 23 novembre 30 août 22 août

Est-ce que quelqu'un sait comment je vais l'obtenir?

2
Brum

Je ne peux pas être trop spécifique sans connaître exactement la structure et les données de la table de la base de données, mais il semble que vos valeurs date soient en train d'être stockées et traitées comme suit:

dd[delimiter]mm[delimiter]yyyy (les délimiteurs peuvent être logiquement / ou -)

Par exemple, si vous stockez la date sous la forme VARCHAR et que la chaîne ressemble à 22/08/17, 30/08/17, 23/11/17, 30/11/17, Alors il est facile de voir que mysql trie vos lignes en lisant les dates sous forme de "chaînes" (de gauche à droite) par opposition à "dates" (y, m, puis d logique).

Il y aura plusieurs façons de résoudre ce problème, mais le meilleur conseil que je puisse vous donner est de corriger les données stockées (car les valeurs de date doivent être stockées de la manière suivante: type de date) et ajustez les codes qui y ont accès. Cela impliquerait de définir la colonne date sur DATE et de lui donner des valeurs au format yyyy-mm-dd. Ensuite, la commande sera simplifiée de manière permanente, mais vous devrez ajuster les valeurs de date de la clause SELECT au format souhaité.

Si vous ne pouvez pas ou ne souhaitez pas corriger le stockage de données, vous pouvez mettre un bandage sur le problème en modifiant toutes les requêtes nécessitant une commande par date.

Si votre colonne de date s'appelle date et que vos valeurs utilisent / Comme délimiteurs, vous pouvez utiliser cette clause ORDER BY Pour trier par année, puis par mois, puis par jour, du plus récent au plus récent. le plus ancien:

ORDER BY STR_TO_DATE(`date`, '%d/%m/%Y') DESC

Voici n sqlfiddle pour montrer ce qui se passe avec l’appel STR_TO_DATE().

1
mickmackusa