Ich konvertiere alle meine SQL Server-Abfragen in MySQL und meine darin enthaltenen Abfragen schlagen WITH
alle fehl. Hier ist ein Beispiel:
WITH t1 AS
(
SELECT article.*, userinfo.*, category.*
FROM question
INNER JOIN userinfo ON userinfo.user_userid = article.article_ownerid
INNER JOIN category ON article.article_categoryid = category.catid
WHERE article.article_isdeleted = 0
)
SELECT t1.*
FROM t1
ORDER BY t1.article_date DESC
LIMIT 1, 3
Antworten:
MySQL vor Version 8.0 unterstützt die WITH-Klausel nicht (CTE in der SQL Server-Sprache; Subquery Factoring in Oracle). Sie müssen also Folgendes verwenden:
Die Anfrage für die Funktion stammt aus dem Jahr 2006.
Wie bereits erwähnt, haben Sie ein schlechtes Beispiel angegeben. Sie müssen keine Unterauswahl durchführen, wenn Sie die Ausgabe der Spalten in keiner Weise ändern:
Hier ist ein besseres Beispiel:
quelle
Das MySQL-Entwicklerteam gab bekannt, dass Version 8.0 Common Table Expressions in MySQL (CTEs) enthalten wird . So können Abfragen wie folgt geschrieben werden:
quelle
In SQL gibt die with-Anweisung eine temporäre benannte Ergebnismenge an, die als Common Table Expression (CTE) bezeichnet wird. Es kann für rekursive Abfragen verwendet werden, wird jedoch in diesem Fall als Teilmenge angegeben. Wenn MySQL Unterauswahlen zulässt, würde ich es versuchen
quelle
Die Funktion "Common Table Expression" ist in MySQL nicht verfügbar. Sie müssen also eine Ansicht oder eine temporäre Tabelle erstellen, um sie zu lösen. Hier habe ich eine temporäre Tabelle verwendet.
Die hier erwähnte gespeicherte Prozedur wird Ihren Bedarf lösen. Wenn ich alle meine Teammitglieder und die zugehörigen Mitglieder erhalten möchte, hilft diese gespeicherte Prozedur:
Code:
Dies kann aufgerufen werden mit:
quelle
Ich bin dem von lisachenko geteilten Link gefolgt und habe einen weiteren Link zu diesem Blog gefunden: http://guilhembichot.blogspot.co.uk/2013/11/with-recursive-and-mysql.html
In diesem Beitrag werden Möglichkeiten zur Emulation der beiden Verwendungen von SQL WITH beschrieben. Wirklich gute Erklärung, wie diese funktionieren, um eine ähnliche Abfrage wie SQL WITH durchzuführen.
1) Verwenden Sie WITH, damit Sie dieselbe Unterabfrage nicht mehrmals ausführen müssen
2) Rekursive Abfragen können mit einer gespeicherten Prozedur ausgeführt werden, die den Aufruf einer rekursiven Abfrage ähnelt.
Und das ist der Code oder die gespeicherte Prozedur
quelle
Diese Funktion wird als allgemeiner Tabellenausdruck http://msdn.microsoft.com/en-us/library/ms190766.aspx bezeichnet
In mySQL können Sie nicht genau das tun. Am einfachsten wäre es wahrscheinlich, eine Ansicht zu erstellen, die diesen CTE widerspiegelt, und einfach aus der Ansicht auszuwählen. Sie können dies mit Unterabfragen tun, aber das wird wirklich schlecht funktionieren. Wenn Sie auf CTEs stoßen, die eine Rekursion durchführen, weiß ich nicht, wie Sie diese ohne Verwendung gespeicherter Prozeduren neu erstellen können.
BEARBEITEN: Wie ich in meinem Kommentar sagte, ist für das von Ihnen veröffentlichte Beispiel kein CTE erforderlich, daher müssen Sie es für die Frage vereinfacht haben, da es nur als geschrieben werden kann
quelle
CREATE/DROP VIEW
), und Sie können einer Ansicht Berechtigungen erteilen.Ich mochte die Antwort von @ Brad aus diesem Thread , wollte aber eine Möglichkeit, die Ergebnisse für die weitere Verarbeitung zu speichern (MySql 8):
Welches produziert:
quelle