MySQL: Ansicht mit Unterabfrage in der FROM-Klausel Begrenzung
-
03-07-2019 - |
Frage
In MySQL 5.0 warum die folgenden Fehler auftreten, wenn eine Ansicht mit einer Unterabfrage in dem FROM-Klausel zu erstellen versuchen?
ERROR 1349 (HY000): Blick SELECT enthält eine Unterabfrage in der FROM-Klausel
Ist dies eine Einschränkung der MySQL-Engine, warum haben sie nicht diese Funktion noch nicht umgesetzt?
Auch, was sind einige gute Abhilfen für diese Einschränkung?
Gibt es Workarounds, die für jede Unterabfrage in der FROM-Klausel arbeiten oder gibt es einige Abfragen, die nicht ohne die Verwendung einer Unterabfrage in der FROM-Klausel ausgedrückt werden kann?
Ein Beispiel query (wurde in einem Kommentar begraben):
SELECT temp.UserName
FROM (SELECT u1.name as UserName, COUNT(m1.UserFromId) as SentCount
FROM Message m1, User u1
WHERE u1.uid = m1.UserFromId
Group BY u1.name HAVING SentCount > 3 ) as temp
Lösung
kann nicht die Abfrage in Ihrem Kommentar nur geschrieben werden als:
SELECT u1.name as UserName from Message m1, User u1
WHERE u1.uid = m1.UserFromID GROUP BY u1.name HAVING count(m1.UserFromId)>3
Das auch mit den bekannten Geschwindigkeitsproblemen mit Unterabfragen in MySQL helfen soll
Andere Tipps
Ich hatte das gleiche Problem. Ich wollte einen Blick zeigen Information des letzten Jahres aus einer Tabelle mit Datensatz von 2009 bis 2011. Hier ist die ursprüngliche Abfrage erstellen:
SELECT a.*
FROM a
JOIN (
SELECT a.alias, MAX(a.year) as max_year
FROM a
GROUP BY a.alias
) b
ON a.alias=b.alias and a.year=b.max_year
Gliederung der Lösung:
- Erstellen Sie eine Ansicht für jede Unterabfrage
- ersetzen Unterabfragen mit diesen Ansichten
Hier ist die Lösung Abfrage:
CREATE VIEW v_max_year AS
SELECT alias, MAX(year) as max_year
FROM a
GROUP BY a.alias;
CREATE VIEW v_latest_info AS
SELECT a.*
FROM a
JOIN v_max_year b
ON a.alias=b.alias and a.year=b.max_year;
Es funktioniert gut auf MySQL 5.0.45, ohne viel von einer Geschwindigkeit Strafe (im Vergleich zur Ausführung die ursprüngliche Unter Abfrage wählen ohne Views).
Es scheint ein bekanntes Problem zu sein.
http://dev.mysql.com/doc/ refman / 5.1 / de / unbenannte-views.html
http://bugs.mysql.com/bug.php?id=16757
Viele IN Abfragen können als (links außen) neu geschrieben werden, schließt sich und ein (nicht) NULL irgendeiner Art. zum Beispiel
SELECT * FROM FOO WHERE ID IN (SELECT ID FROM FOO2)
als neu geschrieben werden
SELECT FOO.* FROM FOO JOIN FOO2 ON FOO.ID=FOO2.ID
oder
SELECT * FROM FOO WHERE ID NOT IN (SELECT ID FROM FOO2)
kann sein
SELECT FOO.* FROM FOO
LEFT OUTER JOIN FOO2
ON FOO.ID=FOO2.ID WHERE FOO.ID IS NULL
für jede Unterabfrage eine Ansicht erstellen ist der Weg zu gehen. Got es wie ein Zauber funktioniert.
Sie können dieses Problem umgehen, indem eine separate Ansicht für jede Unterabfrage Erstellen Sie verwenden möchten, und dann auf die in der Ansicht kommen Sie erstellen. Hier ein Beispiel: http://blog.gruffdavies.com/2015/01/25/a-neat-mysql-hack-to-create-a-view-with-subquery-in-the-from-clause/
Das ist ganz praktisch, da Sie sehr wahrscheinlich, es trotzdem wieder verwenden wollen und helfen Sie, Ihre SQL trocken zu halten.