J'utilise mysql 5.7 et j'ai besoin de trier des listes qui sont stockées comme ceci: mais ces éléments Les listes doivent être commandées par: p> donc le résultat de cet exemple devrait être: p> i utilise La seule solution que j'ai proposée est de faire Y a-t-il des moyens de trier de cette façon sans connaître la quantité maximale d'éléments de la liste? p> p>
groupe par code> et
comptez (*) code> pour trier par la longueur de la liste, mais le problème est - Comment trier par le contenu de la liste si le numéro maximum des articles de la liste est inconnu? p>
n code> jointures gauche sur la même table, où
n code> est cette longueur de liste maximale inconnue , chaque joint pour chaque élément de liste possible. Voir le tableau et ma tentative de trier sur DB Fiddle . P>
3 Réponses :
vous obtenez ainsi des rangées comme: p> Je pense que vous devez faire cela: p> Si vos articles sont des INTS, un rembourrage Les 10 larges avec 0 en font le travail de tri car "0000000123, 00000000124" <"0000000123, 0000000125" P> J'ai choisi 10 larges car int max est de 4,5 milliards de dollars; 10 chiffres. Si votre intégration sera plus petite, vous pouvez couvrir moins p> si vous comparez des booléens, une stratégie similaire, peut-être les convertir en intens (vrai = 0, false = 1?) Alors ils trient eux-mêmes, même lorsqu'ils sont agrégés dans une chaîne .. p> Si une liste de T, T, F Tries avant T, F, F, puis faites T = 0 et F = 1 .. Par exemple P> emprunté à l'ombre et ajusté pour si Les éléments de la liste sont des INTS (et que vous voulez 5 lignes) h3>
Si vous voulez 3 rangs de votre violon .. h3>
élément code> étant un int: p>
Vous pouvez commander par compter (*) code>, puis par
group_concat (élément) code> pour trier par la longueur de la liste, puis en comparant les éléments:
group_concat(LPAD(item, 10, '0') order by item_index asc)
Je suis désolé, j'ai raté un point important - ces articles ne sont pas nécessairement des cordes, ils peuvent également être entier. Je ne peux pas les regrouper, ils devraient être comparés les uns aux autres
@Nadezhdaratskevich mySQL n'est pas un outil de tableur, vous ne pouvez pas avoir différents types de données dans une colonne.
Ils ont sûrement tous le même type, mais j'ai besoin de la solution qui fonctionnerait également sur une autre table comportant des articles entier / booléen, comme celui-ci db-fiddle.com/f/avehj29gp1crgrbg5q9wzp/1
Je pense que cela est aussi proche que vous obtiendrez raisonnablement dans MySQL. Si les données ne sont pas de la chaîne, convertissez-la et coussinez-la, donc il est et trie correctement - voir l'édition que j'ai faite à ma réponse
Est-ce ce que tu veux? Je ne suis pas sûr de la commande
Désolé, j'ai oublié de mentionner qu'il devrait également fonctionner si les articles sont entier ou booléen, comme dans cette table db-fiddle.com/f/avehj29gp1crgrbgg5q9wzp/1
Ça marche. GROUP_CONCAT Travaillez avec des valeurs entières et booléennes.
Oui, cela n'a pas échoué, mais 2 sera considéré comme plus de 19 à cause de la comparaison des ficelles.
La colonne dans l'ordre est compte, pas group_concat
C'est bon maintenant? Il n'est pas nécessaire que la colonne du groupe par clause soit dans les colonnes affichées.
Par "longueur" de la liste Vous voulez dire "ordre croissant de compte d'éléments dans la liste"
Je ne peux pas comprendre ce que la question tente d'accomplir ou de quelle "longueur" est car il n'y a pas de mesure de longueur ou de champ appelé longueur dans la table. - Ah je l'obtiens maintenant. Tous les articles de List_ID donné sont la même liste. Vous voulez d'abord la plus grande liste (et ainsi de suite), puis dans chaque liste des éléments de chaque liste dans l'ordre (par index).
Oui, c'est le nombre d'articles, "ordre croissant de compte d'éléments dans la liste", je vais le modifier
Par "Si le nombre d'éléments est identique, les éléments doivent être comparés dans l'ordre de leur item_index - 0 avec 0, etc." Voulez-vous dire "si deux listes ont le même nombre d'éléments, puis ListItems doit être comparé par ordre d'itemindex et commander alphabétique être utilisé pour décider de la liste de la liste d'abord) "
Je ne suis pas vraiment clairement clair sur si vous voulez une ligne par ligne de ceci (désir un résultat avec 5 lignes?) Ou voulez-vous un ensemble groupé / agrégé (ID de liste unique, colonne de n items de la liste dans un, sortie 3 rangées)
Je souhaite comparer chaque élément de la première liste avec l'élément correspondant de la deuxième liste. E.G La première liste a (1, 3, 3) et la seconde (1, 2, 3) - la deuxième liste vient en premier, car 2 <3. Le jeu de résultats doit contenir des identifiants de listes.
Voir ma réponse mise à jour