Ich bin derzeit damit beschäftigt, eine Art Filter zu implementieren, für den ich für jedes "Tag", nach dem gefiltert werden soll, eine INNER JOIN-Klausel generieren muss.
Das Problem ist, dass ich nach einer ganzen Reihe von SQL eine Tabelle habe, die alle Informationen enthält, die ich für meine Auswahl benötige, aber ich benötige sie erneut für jeden generierten INNER JOIN
Das sieht im Grunde so aus:
SELECT
*
FROM search
INNER JOIN search f1 ON f1.baseID = search.baseID AND f1.condition = condition1
INNER JOIN search f2 ON f2.baseID = search.baseID AND f2.condition = condition2
...
INNER JOIN search fN ON fN.baseID = search.baseID AND fN.condition = conditionN
Dies funktioniert, aber ich würde es sehr bevorzugen, wenn die "Suchtabelle" temporär ist (sie kann mehrere Größenordnungen kleiner sein, wenn es sich nicht um eine normale Tabelle handelt), aber das gibt mir einen sehr ärgerlichen Fehler: Can't reopen table
Einige Nachforschungen führen mich zu diesem Fehlerbericht, aber die Leute bei MySQL scheinen sich nicht darum zu kümmern, dass eine solche Grundfunktion (die eine Tabelle mehrmals verwendet) nicht mit temporären Tabellen funktioniert. Ich habe mit diesem Problem viele Probleme mit der Skalierbarkeit.
Gibt es eine praktikable Problemumgehung, bei der ich möglicherweise nicht viele temporäre, aber sehr reale Tabellen verwalten oder eine große Tabelle mit allen darin enthaltenen Daten verwalten muss?
Herzliche Grüße, Kris
[zusätzlich]
Die Antwort GROUP_CONCAT funktioniert in meiner Situation nicht, da meine Bedingungen mehrere Spalten in einer bestimmten Reihenfolge sind. Sie würde ORs aus dem machen, was ich als ANDs benötigen. Es hat mir jedoch geholfen, ein früheres Problem zu lösen, sodass die Tabelle, ob temporär oder nicht, jetzt nicht mehr benötigt wird. Wir dachten einfach zu allgemein für unser Problem. Die gesamte Anwendung von Filtern wurde jetzt von etwa einer Minute auf weit unter eine Viertelsekunde zurückgeführt.
quelle
Antworten:
Wenn ein Wechsel zu MariaDB (einer Abzweigung von MySQL) möglich ist, wird dieser Ärger dort ab Version 10.2.1 behoben: https://jira.mariadb.org/browse/MDEV-5535 .
quelle
Eine einfache Lösung besteht darin, die temporäre Tabelle zu duplizieren. Funktioniert gut, wenn die Tabelle relativ klein ist, was häufig bei temporären Tabellen der Fall ist.
quelle
Richtig, in den MySQL- Dokumenten heißt es: "Sie können
TEMPORARY
in derselben Abfrage nicht mehr als einmal auf eine Tabelle verweisen ."Hier ist eine alternative Abfrage, die dieselben Zeilen finden sollte, obwohl sich alle Bedingungen für übereinstimmende Zeilen nicht in separaten Spalten befinden, sondern in einer durch Kommas getrennten Liste.
quelle
Ich habe dies umgangen, indem ich eine permanente "temporäre" Tabelle erstellt und die SPID (sorry, ich komme aus dem SQL Server-Land) an den Tabellennamen angehängt habe, um einen eindeutigen Tabellennamen zu erstellen. Erstellen Sie anschließend dynamische SQL-Anweisungen, um die Abfragen zu erstellen. Wenn etwas Schlimmes passiert, wird die Tabelle gelöscht und neu erstellt.
Ich hoffe auf eine bessere Option. Komm schon, MySQL Devs. Die 'Bug' / 'Feature Request' ist seit 2008 geöffnet! Scheint, als ob sich alle 'Bugs', denen wir begegnet sind, im selben Boot befinden.
quelle
Persönlich würde ich es einfach zu einem dauerhaften Tisch machen. Möglicherweise möchten Sie eine separate Datenbank für diese Tabellen erstellen (vermutlich benötigen sie eindeutige Namen, da viele dieser Abfragen gleichzeitig ausgeführt werden können), damit Berechtigungen auch sinnvoll festgelegt werden können (Sie können Berechtigungen für Datenbanken festlegen; Sie können ' t Berechtigungen für Tabellen-Platzhalter festlegen).
Dann benötigen Sie auch einen Bereinigungsjob, um gelegentlich alte zu entfernen (MySQL merkt sich bequemerweise die Zeit, zu der eine Tabelle erstellt wurde, sodass Sie damit einfach herausfinden können, wann eine Bereinigung erforderlich ist).
quelle
Ich konnte die Abfrage in eine permanente Tabelle ändern und dies hat sie für mich behoben. (Die VLDB-Einstellungen in MicroStrategy, temporärer Tabellentyp, wurden geändert.)
quelle
Sie können dies umgehen, indem Sie entweder eine permanente Tabelle erstellen, die Sie anschließend entfernen, oder einfach zwei separate temporäre Tabellen mit denselben Daten erstellen
quelle
Hier sind die MYSQL-Dokumente zu diesem Problem. Ich verwende doppelte temporäre Tabellen wie einige der obigen Antworten. Möglicherweise haben Sie jedoch eine Situation, in der ein CTE angemessen ist!
https://dev.mysql.com/doc/refman/8.0/en/temporary-table-problems.html
quelle