Ich habe eine MySQL 5.6-Ansicht, die eine Union benötigt. Ich habe hier auf Stack Overflow gelesen, dass es einen Serverfehler gibt, der die Vereinigung in einer Ansicht verwendet. Die Lösung besteht darin, Klammern aus dem from zu entfernen. Ich habe das gemacht, aber es funktioniert nicht und ich hoffte, dass jemand mir irgendwie helfen kann, an dem Käfer vorbeizukommen.MySQL-Ansicht mit Union funktioniert nicht nach Fehler beheben
Ich habe 2 Tabellen ordersuccess und orderfailure. Die Ansicht berechnet einen Prozentsatz des Erfolgs für diesen Zeitraum. Der Zeitraum ist alle 15m, 4 pro Stunde, 15,30,45,00. Hier ist Schema, beide sind gleich. Eine Zählung von 0 wird der Tabelle nicht hinzugefügt. Ein Nullwert kann 0 oder 100 sein, abhängig von der ifnull-Anweisung.
+---------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | dtime | datetime | NO | PRI | NULL | | | counter | bigint(20) | NO | | NULL | | | rate | bigint(20) | YES | | NULL | | +---------+------------+------+-----+---------+-------+
Ich habe einen Kalender-Tabelle in die Lücken zu füllen, wenn nichts während eines Zeitraums gemeldet wird. Es hat nur Datum/Uhrzeit für jeden Zeitraum. Hier ist Kalender Tabelle;
+-------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+-------+ | dtime | datetime | NO | PRI | NULL | | +-------+----------+------+-----+---------+-------+
Hier ist die Abfrage, um die richtigen Daten zurück.
Ich muss mehrere Ansichten machen, weil in der from-Klausel ausgewählt hat. Hier ist meine create Ansicht für diese Abfrage. Ich entfernte alle Klammern, die ich konnte. Habe ich etwas übersehen oder gibt es eine bessere Möglichkeit, die Anfrage zu schreiben?
CREATE ALGORITHM=UNDEFINED [email protected] SQL SECURITY DEFINER VIEW d61_14521 AS select '1000591' AS id, c.dtime AS dtime, 0 AS rate, ifnull(p.percent,100) AS counter from calendar c left join d61p2_14521 p on c.dtime = p.dtime;
CREATE ALGORITHM=UNDEFINED [email protected] SQL SECURITY DEFINER VIEW d61P2_14521 AS select '1000591' AS id, c.dtime AS dtime, '0' AS rate, ifnull(p.percent,100) AS counter
from d61P3_14521 union d61P6_14521 where c.dtime < now();
CREATE ALGORITHM=UNDEFINED [email protected] SQL SECURITY DEFINER VIEW d61P3_14521 AS select ifnull(f.dtime,s.dtime) as dtime, ifnull(ifnull(s.counter,0)/(ifnull(s.counter,0) + ifnull(f.counter,0)) * 100,100) as percent from d61P4_14521 s right join d61P5_14521 f on s.dtime=f.dtime ;
CREATE ALGORITHM=UNDEFINED [email protected] SQL SECURITY DEFINER VIEW d61P4_14521 AS select * from OrderSummarySuccess_14521 where id = 1000591 ;
CREATE ALGORITHM=UNDEFINED [email protected] SQL SECURITY DEFINER VIEW d61P5_14521 AS select * from OrderSummaryFailure_14521 where id = 1000591;
CREATE ALGORITHM=UNDEFINED [email protected] SQL SECURITY DEFINER VIEW d61P6_14521 AS select ifnull(f.dtime,s.dtime) as dtime, ifnull(ifnull(s.counter,0)/(ifnull(s.counter,0) + ifnull(f.counter,0)) * 100,100) as percent from d61P4_14521 s left join d61P5_14521 f on s.dtime=f.dtime ;
Ich erstelle die Ansichten in dieser Reihenfolge. Sie haben Erfolg bis d61P2_14521.
- d61P4_14521
- d61P5_14521
- d61P6_14521
- d61P3_14521
- d61P2_14521
Die Ansicht, dass ist d61P2_14521 ausfällt. Hier ist der Fehler.
mysql> CREATE ALGORITHM=UNDEFINED [email protected] SQL SECURITY DEFINER -> VIEW d61P2_14521 AS select -> '1000591' AS id, -> c.dtime AS dtime, -> '0' AS rate, -> ifnull(p.percent,100) AS counter -> from -> d61P3_14521 -> union -> d61P6_14521 -> where c.dtime < now(); ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'vod61P6_14521 where c.dtime < now()' at line 10
Union ist für Select-Anweisungen, nicht Joins. es ist 'select ... UNION select ...'. doing 'select ... join foo UNION bar' ist illegal/unmöglich. –
Ich habe die gleiche Syntax in der Arbeitsabfrage verwendet und die Abfrage funktioniert. es ist der einzige Weg, wie ich eine vollständige äußere Verbindung in MySQL machen kann. – dean
nein, hast du nicht. In deiner "arbeitenden" Abfrage hast du 'select ... union select ...'.Nur weil eine Ansicht eine gespeicherte Auswahl ist, bedeutet das nicht, dass Sie den Namen der Ansicht anstelle einer Auswahl verwenden. –