0
votes

Mariahb Simple Select Commande ne trie pas

Le SQL pour MARIADB:

CREATE TABLE `cms_template_items` (
 `id` INT(11) NOT NULL AUTO_INCREMENT,
 `description` VARCHAR(255) NOT NULL COLLATE 'utf8mb4_unicode_520_ci',
 `name` VARCHAR(255) NOT NULL COLLATE 'utf8mb4_unicode_520_ci',
 `url` VARCHAR(255) NOT NULL COLLATE 'utf8mb4_unicode_520_ci',
 PRIMARY KEY (`id`)
)
COLLATE='utf8mb4_unicode_520_ci'
ENGINE=MyISAM
AUTO_INCREMENT=103;


2 commentaires

Montrez-nous Sélectionnez Nom, Hex (Nom) à partir de template_items Commandez par nom; et aussi Afficher créer la table Table_Name .


@RickJames mis à jour.


3 Réponses :


0
votes

tandis que l'erreur utilisateur est habituellement em> où le problème peut être trouvé, il est littéralement em> un bogue-conception. Le type de colonne est varchar code> et apparemment mariadb est trop paresseux pour trier les numéros, uniquement par des lettres em>.

donc j'ai supprimé la commande par code > Clause et la gestion du tri par PHP, qui obtient le travail effectué avec compétence: P>

$items = array();
while ($row1 = mysqli_fetch_assoc($result1))
{
 array_push($items,$row1['name']);
}
sort($items);
echo '<pre>'.print_r($items,1).'</pre>';
  • Certains gars se connectaient à la mauvaise base de données après un transfert de serveur. Li>
  • quelque chose à propos d'un Enum code> type. (Vérifiez vos types de colonne!) LI> ul>

    Si quelqu'un sait comment forcer Mariadb à commander correctement des rangées alphanumériquement, n'hésitez pas à poster une réponse de travail p> p> p>.


5 commentaires

h1 serait traité comme 0 et ne trierait pas entre 3.1 et 2.9 .


Commandez par Concat ('', Nom) ASC .


@RickJames Cela fonctionne très bien localhost sur php 7.2.9 mais ne pas vivre sur 7.3.7. : - \


La version de PHP ne devrait pas affecter les actions dans MySQL ??


@RickJames Non, a été confondu entre les différences de serveur local et en direct (les espaces étaient uniquement sur le serveur Live).



1
votes

Notez l'espace principal (HEX 20) sur les deux premières lignes. Les espaces trient avant les personnages visibles; Les chiffres tristent avant les lettres.

20 33 ...
20 68 ...
32 2E ...


1 commentaires

Ah, je l'ai remarqué que tout en testant d'autres options que j'ai rencontrées; allez comprendre. Merci beaucoup de rick!



1
votes

Comme vous l'avez dit dans votre réponse ci-dessus, le problème est que varchar est effectué lexicographiquement. Il regarde littéralement tous les personnages et ne fait pas de commander naturel.

Un moyen de contourner cela dans SQL serait de séparer la partie numérique de votre champ nom du reste. Idéalement, vous voulez quelque chose d'équivalent à ceci: xxx

maintenant, pour obtenir des sections distinctes nom_numérique et nom_alpha , vous pouvez Faites quelque chose comme ceci: xxx

L'idée est de première commande par la partie numérique du nom sur le côté gauche de la chaîne, puis regardez tout le reste à droite du premier espace. Notez que la partie numérique est convertie en décimale (4,2).

L'approche spécifique dépendra fortement du format de vos données. Vous devrez peut-être modifier un peu la regex et vous souhaiterez peut-être une valeur décimale avec plus de précision. Vous pouvez également avoir des groupes supplémentaires dans le groupe par , si nécessaire.

mais à la fin, le tri sur la couche d'application est plus facile et sera plus flexible. L'approche ci-dessus ne fonctionnera que si le modèle de vos données est relativement cohérent.


0 commentaires