it-swarm.com.de

Die Tabelle aus einem der SELECTS kann nicht in der Feldliste verwendet werden

Ich versuche die folgende Abfrage in einer MySQL-basierten Datenbank:

SELECT 
    alert.name, alert.new_state_date, alert.prev_state_date
FROM
    grafana.alert
WHERE
    alert.id = 1 
UNION SELECT 
    annotation.Epoch
FROM
    grafana.annotation
ORDER BY annotation.id DESC
LIMIT 1;

Meine Absicht ist es, nur die Daten im selben Bereich anzuzeigen, damit ich nicht mehr hin und her wechseln kann. Ich erhalte jedoch den folgenden Fehler:

Fehlercode: 1250. Die Tabelle 'Annotation' von einem der SELECTs kann nicht in der Feldliste verwendet werden

4
MrDuk

Um die beiden Abfragen für ein UNION kompatibel zu machen, füllen Sie die Spaltenliste des zweiten mit NULLs, um der Länge des ersten zu entsprechen. Um sicherzugehen, dass die Typen der ersten Spalte übereinstimmen, können Sie sie explizit cast() zu char. (Optional, wenn es sich bereits um kompatible Typen handelt.)

Auch verwenden UNION ALL weil UNION (ohne ALL) versucht, Duplikate zu entfernen.

Und ich denke die ORDER BY war für das Ergebnis gedacht FROM grafana.annotatio nicht für die gesamte Ergebnismenge. Um MySQL darüber zu informieren, setzen Sie die zweite Abfrage in Klammern.

SELECT cast(alert.name AS char),
       alert.new_state_date,
       alert.prev_state_date
       FROM grafana.alert
       WHERE alert.id = 1 
UNION ALL
(SELECT cast(annotation.Epoch AS char),
        NULL,
        NULL
        FROM grafana.annotation
        ORDER BY annotation.id DESC
        LIMIT 1);

Wenn beide Abfragen eine Zeile zurückgeben, können Sie sie auch kreuzen, um die Ergebnisse nebeneinander anzuzeigen.

SELECT *
       FROM (SELECT alert.name,
                    alert.new_state_date,
                    alert.prev_state_date
                    FROM grafana.alert
                    WHERE alert.id = 1) x
            CROSS JOIN (SELECT annotation.Epoch
                               FROM grafana.annotation
                               ORDER BY annotation.id DESC
                               LIMIT 1) y;
3
sticky bit