0
votes

MySQL: Listes de commandes par nombre d'éléments, puis par le contenu

J'utilise mysql 5.7 et j'ai besoin de trier des listes qui sont stockées comme ceci: xxx

mais ces éléments ne sont pas nécessairement des cordes , ils peuvent être entier Ou Boolean, c'est juste une simplification.

Les listes doivent être commandées par:

  1. Nombre d'éléments de la liste
  2. Si deux listes ont le même nombre d'éléments, alors leurs articles doivent être comparés dans l'ordre de item_index

    donc le résultat de cet exemple devrait être:

    1. 2 - Orange
    2. 1 - Apple, banane
    3. 0 - Apple, pain

      i utilise groupe par et comptez (*) 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?

      La seule solution que j'ai proposée est de faire n jointures gauche sur la même table, où n 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 .

      Y a-t-il des moyens de trier de cette façon sans connaître la quantité maximale d'éléments de la liste?


7 commentaires

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


3 Réponses :


2
votes

comme ceci, si vous voulez 5 rangs de votre violon: xxx

vous obtenez ainsi des rangées comme: xxx

si Les éléments de la liste sont des INTS (et que vous voulez 5 lignes)

Je pense que vous devez faire cela: xxx

Si vos articles sont des INTS, un rembourrage Les 10 larges avec 0 en font le travail de tri car "0000000123, 00000000124" <"0000000123, 0000000125"

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

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 ..

Si une liste de T, T, F Tries avant T, F, F, puis faites T = 0 et F = 1 .. Par exemple

Si vous voulez 3 rangs de votre violon ..

emprunté à l'ombre et ajusté pour élément étant un int: xxx < / h3>


0 commentaires

3
votes

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)


4 commentaires

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



0
votes

Est-ce ce que tu veux? Je ne suis pas sûr de la commande xxx


5 commentaires

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.