2010-06-21 5 views
0

J'essaie d'interroger une base de données Wordpress et d'obtenir les titres de poste à trier dans un ordre correct. Les titres sont formatés comme suit: Titre 1, Titre 2 .. Je dois les trier dans l'ordre croissant, comment puis-je faire cela? Si je trier juste eux, ils sortiront monter comme: 1,10,11 ...'Tri naturel' avec MySQL?

En ce moment, ma commande par déclaration est cela, mais il ne fait rien:

ORDER BY CONVERT(p.post_title,SIGNED) ASC; 

Répondre

0

Si le # est toujours à la fin comme ça, vous pouvez faire une manipulation de chaînes pour le faire fonctionner:

SELECT *, CAST(RIGHT(p.post_title,2) AS UNSIGNED) AS TITLE_INDEX 
FROM wp_posts p 
ORDER BY TITLE_INDEX asc 

peut-être nécessaire de ruser un peu en supposant que vous avez peut-être un ou 100+ 1000+ chiffres aussi bien.

2

Les fonctions par ligne sont une mauvaise idée dans toute base de données que vous souhaitez bien mettre à l'échelle. C'est parce qu'ils doivent effectuer le calcul sur chaque ligne vous récupérez chaque fois vous faites un select. La méthode intelligente de l'administrateur de base de données consiste à créer une toute nouvelle colonne contenant la clé de tri calculée et à utiliser un déclencheur d'insertion/mise à jour pour s'assurer qu'il est correctement défini. Le moyen signifie que le calcul est effectué uniquement en cas de besoin et amortit son coût sur l'ensemble des sélections.

C'est l'un des rares cas où il est acceptable de revenir à la troisième forme normale, car l'utilisation des déclencheurs empêche l'incohérence des données. Presque personne ne se plaint de l'espace disque occupé par leurs bases de données, la grande majorité des questions concernent la vitesse. Et, en utilisant cette méthode et en indexant la nouvelle colonne, vos requêtes vont absolument hurler.

Donc, fondamentalement, vous créez une autre colonne appelée natural_title cartographié comme suit:

title   natural_title 
-----   ------------- 
title 1  title 00001 
title 2  title 00002 
title 10  title 00010 
title 1024  title 01024 

assurant que la fonction de mappage utilisé dans la gâchette permet de la valeur maximale autorisée. Ensuite, vous utilisez une requête comme:

select title from articles 
order by natural_title asc 
+0

Je vous entends à propos des fonctions par ligne, mais c'est Wordpress. Très probablement, la table a beaucoup moins de 10000 lignes. En outre, l'ajout d'un champ à une table Wordpress sera interrompu lors de la mise à niveau. Une solution potentielle serait de créer une table séparée avec post_id et natural_title et de rejoindre et trier. – brendan

Questions connexes