来自 SELECT 之一的表不能在字段列表中使用

MrD*_*Duk 5 mysql query

我正在基于 MySQL 的数据库中尝试以下查询:

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;
Run Code Online (Sandbox Code Playgroud)

我的目的是让数据显示在同一个面板中,这样我就可以停止来回切换。但是,我收到以下错误:

错误代码:1250。来自 SELECT 之一的表“注释”不能在字段列表中使用

sti*_*bit 3

为了使两个查询兼容 a,UNION请用 s 填充第二个查询的列列表NULL,以匹配第一个查询的长度。为了确保第一列的类型匹配,您可以将cast()它们显式地设置为char. (如果它们已经是兼容类型,则可选。)

还可以使用UNION ALLbecause UNION(without ALL)尝试消除重复项。

我猜这ORDER BY是针对结果FROM grafana.annotatio而不是整个结果集。为了让 MySQL 知道这一点,请将第二个查询放在括号中。

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);
Run Code Online (Sandbox Code Playgroud)

如果两个查询都返回一行,您还可以交叉连接它们,以便并排显示结果。

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;
Run Code Online (Sandbox Code Playgroud)