Comment puis-je simuler une variable tableau dans MySQL?
Il apparaît que MySQL n'a pas de variables de tableau. Que dois-je utiliser à la place?
Il semble y avoir deux solutions proposées: Une jeu de type scalaire et tables temporaires. La question que je me suis lié d'suggère l'ancien. Mais il est de bonne pratique d'utiliser ces au lieu de variables de tableau? Sinon, si je pars avec des ensembles, ce qui serait la base de jeu de l'idiome équivalent à foreach
?
- Utiliser les
ELT
. - Pouvez-vous lier à un niveau plus détaillé de la discussion de l'ELT, peut-être avec un plus exemple?
Vous devez vous connecter pour publier un commentaire.
Bien, j'ai été en utilisant les tables temporaires au lieu de variables de type tableau. Pas la plus grande solution, mais il fonctionne.
Notez que vous n'avez pas besoin de définir formellement leurs champs, il suffit de créer entre eux à l'aide d'un SELECT:
(Voir aussi Créer une table temporaire d'instruction select sans l'aide de Create Table.)
Vous pouvez atteindre cet objectif dans MySQL à l'aide de
WHILE
boucle:EDIT:
Sinon, vous pouvez le faire en utilisant
UNION ALL
:CALL
il.UNION ALL
sans l'aide de la procédure.ELT(x, @myArrayOfValue);
jusqu'à ce que vous obteneznull
?Essayez d'utiliser FIND_IN_SET() la fonction de MySql
par exemple,
Remarque: Vous n'avez pas à DÉFINIR la variable dans StoredProcedure si vous êtes de passage de paramètre avec CSV valeurs.
Ne sais pas sur les tableaux, mais il est un moyen de stocker séparées par des virgules listes normal de la colonne de type VARCHAR.
Et quand vous avez besoin de trouver quelque chose dans cette liste, vous pouvez utiliser le FIND_IN_SET() fonction.
De nos jours à l'aide d'un tableau JSON serait une réponse évidente.
Puisque c'est un vieux mais toujours pertinent de se demander, j'ai réalisé un court exemple.
JSON fonctions sont disponibles depuis mySQL 5.7.x /MariaDB 10.2.3
Je préfère cette solution plutôt que l'ELT() parce que c'est vraiment plus comme un tableau et ce "tableau" peut être réutilisé dans le code.
Mais attention: Il (JSON) est certainement beaucoup plus lent que d'utiliser une table temporaire. Son juste plus pratique. l'omi.
Ici est de savoir comment utiliser un tableau JSON:
Et voici un petit exemple pour montrer comment cela fonctionne dans une fonction/procédure:
Peut-être créer une mémoire temporaire table avec des colonnes (clé, valeur) si vous voulez des tableaux associatifs. Avoir une table mémoire est la chose la plus proche pour avoir des tableaux dans mysql
Voici comment je l'ai fait.
Tout d'abord, j'ai créé une fonction qui vérifie si une Longue/Integer/quelle que soit la valeur est une liste de valeurs séparées par des virgules:
Alors maintenant, vous pouvez rechercher un ID dans une liste séparée par des virgules des Id, comme ceci:
Et vous pouvez utiliser cette fonction à l'intérieur d'une clause where, comme ceci:
C'était le seul moyen que j'ai trouvé pour passer un "tableau" de paramètre à une PROCÉDURE.
Cela fonctionne très bien pour la liste de valeurs:
Les deux versions à l'aide de jeux ne fonctionne pas pour moi (testé avec MySQL 5.5). La fonction ELT() retourne l'ensemble. Considérant l'instruction WHILE est uniquement disponible dans le contexte de la PROCÉDURE je l'ai ajouté à ma solution:
Pour être honnête, je ne pense pas que c'est une bonne pratique. Même si ses vraiment nécessaire, c'est à peine lisible et assez lente.
Je sais que c'est un peu une réponse tardive, mais j'ai récemment eu à résoudre un problème semblable et de la pensée que cela pourrait être utile à d'autres.
Fond
Considérer le tableau ci-après appelé 'mytable':
Le problème était de ne garder que les 3 dossiers et de supprimer tous les vieux dossiers, dont idsystème=1 (il pourrait y avoir de nombreux autres enregistrements dans la table avec d'autres idsystème valeurs)
Il serait bon est vous pouvez le faire simplement en utilisant l'instruction
Cependant, ce n'est pas encore prise en charge dans MySQL et si vous essayez cela, vous obtiendrez un message d'erreur comme
Donc une solution de contournement est nécessaire en vertu de laquelle un tableau de valeurs est passé à la DANS le sélecteur à l'aide de la variable. Cependant, comme les variables doivent être des valeurs à un seul, j'aurais besoin de simuler un tableau. L'astuce consiste à créer le tableau comme une liste séparée par des virgules de valeurs (chaîne de caractères) et d'assigner à la variable comme suit
Le résultat stocké dans @myvar est
Prochain, le FIND_IN_SET sélecteur est utilisé pour sélectionnez à partir de la simulation de la matrice de
Le combiné du résultat final se présente comme suit:
Je suis conscient que c'est un cas très spécifique. Toutefois, il peut être modifié pour convenir à tous les autres cas où une variable pour stocker un tableau de valeurs.
J'espère que cela aide.
N'est pas le point de tableaux afin d'être efficace? Si vous êtes juste de l'itération sur les valeurs, je pense qu'un curseur sur un temporaire (ou permanente) de la table de fait plus de sens que de chercher des virgules, non? Aussi plus propre. Recherche de "mysql DECLARE CURSOR".
Pour un accès aléatoire à une table temporaire avec indexé numériquement clé primaire. Malheureusement, la manière la plus rapide d'accès que vous obtenez est une table de hachage, pas vrai d'accès aléatoire.
En MYSQL version après 5.7.x, vous pouvez utiliser JSON type pour stocker un tableau. Vous pouvez obtenir la valeur d'un tableau par une clé via MYSQL.
Inspiré par la fonction ELT(numéro d'index, mot1, mot2, string3,...),je pense que l'exemple suivant fonctionne comme un tableau exemple:
Espère que ça aide.
Je suis surpris aucune des réponses mentionnent ELT/CHAMP.
ELT/CHAMP fonctionne de manière très similaire à un tableau en particulier si vous avez des données statiques.
FIND_IN_SET travaille également similaire mais qui n'ont pas construit dans l'complémentaires
fonction, mais il est assez facile d'en écrire un.
Je Pense que je peux améliorer sur cette réponse. Essayez ceci:
Le paramètre "Farces" est un fichier CSV. c'est à dire. '1,2,3,4.....etc'
Cette méthode rend la chaîne recherchée de CSV valeurs progressivement plus court à chaque itération de la boucle, ce qui je pense serait mieux pour l'optimisation.
Je voudrais essayer quelque chose comme cela pour de multiples collections. Je suis un MySQL débutant. Désolé pour les noms de fonction, ne pouvait pas décider de ce que les noms seraient meilleures.
Avez-vous essayé d'utiliser serialize () de PHP?
Qui vous permet de stocker le contenu d'une variable de tableau dans une chaîne de caractères en PHP comprend et est sans danger pour la base de données (en supposant que vous avez échappé à ce premier).
Vous pouvez également faire exactement la même sans un numéro de tableau
ou