Es scheint, dass MySQL keine Array-Variablen hat. Was soll ich stattdessen verwenden?
Es scheinen zwei Alternativen vorgeschlagen zu werden: Skalare vom Set-Typ und temporäre Tabellen . Die Frage, die ich verlinkt habe, deutet auf die erstere hin. Aber ist es eine gute Praxis, diese anstelle von Array-Variablen zu verwenden? Wenn ich alternativ zu Mengen gehe, was wäre die satzbasierte Redewendung foreach
?
ELT
.Antworten:
Nun, ich habe temporäre Tabellen anstelle von Array-Variablen verwendet. Nicht die beste Lösung, aber es funktioniert.
Beachten Sie, dass Sie ihre Felder nicht formal definieren müssen, sondern sie nur mit SELECT erstellen:
(Siehe auch Temporäre Tabelle aus select-Anweisung erstellen, ohne Tabelle erstellen zu verwenden .)
quelle
Sie können dies in MySQL mit
WHILE
loop erreichen:BEARBEITEN: Alternativ können Sie dies tun mit
UNION ALL
:quelle
CALL
diese schreiben .UNION ALL
ohne Prozedur tun .Versuchen Sie es mit der Funktion FIND_IN_SET () von MySql, z
Hinweis: Sie müssen die Variable SET in StoredProcedure nicht festlegen, wenn Sie Parameter mit CSV-Werten übergeben.
quelle
Heutzutage wäre die Verwendung eines JSON-Arrays eine offensichtliche Antwort.
Da dies eine alte, aber immer noch relevante Frage ist, habe ich ein kurzes Beispiel erstellt. JSON-Funktionen sind seit mySQL 5.7.x / MariaDB 10.2.3 verfügbar
Ich bevorzuge diese Lösung gegenüber ELT (), da sie eher einem Array ähnelt und dieses 'Array' im Code wiederverwendet werden kann.
Aber seien Sie vorsichtig: Es (JSON) ist sicherlich viel langsamer als die Verwendung einer temporären Tabelle. Es ist einfach praktischer. imo.
So verwenden Sie ein JSON-Array:
Und hier ein kleines Beispiel, um zu zeigen, wie es in einer Funktion / Prozedur funktioniert:
quelle
Sie kennen die Arrays nicht, aber es gibt eine Möglichkeit, durch Kommas getrennte Listen in einer normalen VARCHAR-Spalte zu speichern.
Und wenn Sie etwas in dieser Liste finden müssen, können Sie die Funktion FIND_IN_SET () verwenden.
quelle
quelle
Ich weiß, dass dies eine etwas späte Antwort ist, aber ich musste kürzlich ein ähnliches Problem lösen und dachte, dass dies für andere nützlich sein könnte.
Hintergrund
Betrachten Sie die folgende Tabelle mit dem Namen "mytable":
Das Problem bestand darin, nur die letzten 3 Datensätze zu behalten und alle älteren Datensätze zu löschen, deren System-ID = 1 ist (es könnten viele andere Datensätze in der Tabelle mit anderen System-ID-Werten vorhanden sein).
Es wäre gut, wenn Sie dies einfach mit der Anweisung tun könnten
Dies wird jedoch in MySQL noch nicht unterstützt und wenn Sie dies versuchen, erhalten Sie eine Fehlermeldung wie
Daher ist eine Problemumgehung erforderlich, bei der ein Array von Werten mithilfe einer Variablen an den IN-Selektor übergeben wird. Da Variablen jedoch einzelne Werte sein müssen, müsste ich ein Array simulieren . Der Trick besteht darin, das Array als durch Kommas getrennte Werteliste (Zeichenfolge) zu erstellen und diese der Variablen wie folgt zuzuweisen
Das in @myvar gespeicherte Ergebnis ist
Als nächstes wird der Selektor FIND_IN_SET verwendet, um aus dem simulierten Array auszuwählen
Das kombinierte Endergebnis ist wie folgt:
Mir ist bewusst, dass dies ein sehr spezifischer Fall ist. Es kann jedoch so geändert werden, dass es fast jedem anderen Fall entspricht, in dem eine Variable ein Array von Werten speichern muss.
Ich hoffe das hilft.
quelle
Erstellen Sie möglicherweise eine temporäre Speichertabelle mit Spalten (Schlüssel, Wert), wenn Sie assoziative Arrays möchten. Eine Speichertabelle zu haben, kommt Arrays in MySQL am nächsten
quelle
So habe ich es gemacht.
Zuerst habe ich eine Funktion erstellt, die prüft, ob ein Long / Integer / Whatever-Wert in einer durch Kommas getrennten Werteliste enthalten ist:
Jetzt können Sie in einer durch Kommas getrennten Liste von IDs wie folgt nach einer ID suchen:
Und Sie können diese Funktion in einer WHERE-Klausel wie folgt verwenden:
Dies war die einzige Möglichkeit, einen "Array" -Parameter an ein PROCEDURE zu übergeben.
quelle
Ist der Sinn von Arrays nicht effizient? Wenn Sie nur Werte durchlaufen, ist ein Cursor auf einer temporären (oder permanenten) Tabelle meiner Meinung nach sinnvoller als das Suchen nach Kommas, oder? Auch sauberer. Suchen Sie nach "mysql DECLARE CURSOR".
Für den wahlfreien Zugriff eine temporäre Tabelle mit numerisch indiziertem Primärschlüssel. Leider ist der schnellste Zugriff eine Hash-Tabelle, kein echter Direktzugriff.
quelle
Ich bin überrascht, dass in keiner der Antworten ELT / FIELD erwähnt wird.
ELT / FIELD funktioniert einem Array sehr ähnlich, insbesondere wenn Sie statische Daten haben.
FIND_IN_SET funktioniert ebenfalls ähnlich, verfügt jedoch nicht über eine integrierte Komplementärfunktion, aber es ist einfach genug, eine zu schreiben.
quelle
Dies funktioniert gut für eine Liste von Werten:
quelle
Beide Versionen mit Sets haben bei mir nicht funktioniert (getestet mit MySQL 5.5). Die Funktion ELT () gibt den gesamten Satz zurück. Da die WHILE-Anweisung nur im PROCEDURE-Kontext verfügbar ist, habe ich sie meiner Lösung hinzugefügt:
Um ehrlich zu sein, denke ich nicht, dass dies eine gute Praxis ist. Auch wenn es wirklich notwendig ist, ist dies kaum lesbar und ziemlich langsam.
quelle
Ein anderer Weg, um das gleiche Problem zu sehen. Hoffe hilfreich
quelle
In der MYSQL-Version nach 5.7.x können Sie den JSON-Typ zum Speichern eines Arrays verwenden. Sie können den Wert eines Arrays über einen Schlüssel über MYSQL abrufen.
quelle
Inspiriert von der Funktion ELT (Indexnummer, Zeichenfolge1, Zeichenfolge2, Zeichenfolge3,…) funktioniert das folgende Beispiel meines Erachtens als Array-Beispiel:
Hoffe es hilft.
quelle
Hier ist ein Beispiel für MySQL zum Durchlaufen einer durch Kommas getrennten Zeichenfolge.
Dies verwendet die
get_from_delimiter_split_string
hier definierte Funktion: https://stackoverflow.com/a/59666211/3068233quelle
Ist eine Array-Variable wirklich notwendig?
Ich frage, weil ich ursprünglich hier gelandet bin und ein Array als MySQL-Tabellenvariable hinzufügen möchte. Ich war relativ neu im Datenbankdesign und versuchte zu überlegen, wie ich es in einer typischen Programmiersprache machen würde.
Datenbanken sind jedoch unterschiedlich. Ich dachte, ich wollte ein Array als Variable, aber es stellt sich heraus, dass dies keine übliche MySQL-Datenbankpraxis ist.
Standardverfahren
Die alternative Lösung zu Arrays besteht darin, eine zusätzliche Tabelle hinzuzufügen und dann mit einem Fremdschlüssel auf Ihre ursprüngliche Tabelle zu verweisen.
Stellen wir uns als Beispiel eine Anwendung vor, die alle Artikel erfasst, die jede Person in einem Haushalt im Geschäft kaufen möchte.
Die Befehle zum Erstellen der Tabelle, die ich mir ursprünglich vorgestellt hatte, hätten ungefähr so ausgesehen:
Ich denke, ich habe mir buy_list als eine durch Kommas getrennte Folge von Gegenständen oder so etwas vorgestellt.
Aber MySQL hat kein Array-Typ-Feld, also brauchte ich wirklich so etwas:
Hier definieren wir eine Einschränkung mit dem Namen fk_person. Es heißt, dass das Feld "Person" in BuyList ein Fremdschlüssel ist. Mit anderen Worten, es ist ein Primärschlüssel in einer anderen Tabelle, insbesondere das Feld 'Name' in der Personentabelle, was in REFERENZEN angegeben ist.
Wir haben auch die Kombination von Person und Gegenstand als Primärschlüssel definiert, aber technisch ist dies nicht erforderlich.
Wenn Sie alle Elemente in der Liste einer Person abrufen möchten, können Sie diese Abfrage ausführen:
Dies gibt Ihnen alle Elemente auf Johns Liste. Keine Arrays notwendig!
quelle
Wenn wir so einen Tisch haben
und die Array-Tabelle:
Wir können die Zeilen der zweiten Tabelle als ein Array mit der CONCAT-Funktion auswählen:
quelle
Ich denke, ich kann diese Antwort verbessern. Versuche dies:
Der Parameter 'Streiche' ist eine CSV. dh. '1,2,3,4 ..... etc'
Diese Methode verkürzt die gesuchte Zeichenfolge von CSV-Werten mit jeder Iteration der Schleife zunehmend, was meiner Meinung nach für die Optimierung besser wäre.
quelle
Ich würde so etwas für mehrere Sammlungen versuchen. Ich bin ein MySQL-Anfänger. Entschuldigung für die Funktionsnamen, konnte mich nicht entscheiden, welche Namen am besten sind.
quelle
Anstatt Daten als Array oder nur in einer Zeile zu speichern, sollten Sie für jeden empfangenen Wert unterschiedliche Zeilen erstellen. Dies macht es viel einfacher zu verstehen, als alles zusammenzufügen.
quelle
Haben Sie versucht, PHPs serialize () zu verwenden? Auf diese Weise können Sie den Inhalt des Arrays einer Variablen in einer Zeichenfolge speichern, die PHP versteht und für die Datenbank sicher ist (vorausgesetzt, Sie haben sie zuerst maskiert).
Sie können dies auch ohne nummeriertes Array tun
oder
quelle