mysql union全部带有别名,语法错误

mysql union全部带有别名,语法错误,mysql,union,Mysql,Union,为什么我会受伤 Error in query (1064): Syntax error near 'as q2)' at line 7 与 我不能在UNION中使用别名吗 更新: 这个查询可能有另一个查询的遗留问题,我首先要理解语法错误 我想计算的是,与昨天相同的时间段相比,今天最后两个小时的点击量增加或减少了两个总和的百分比 该表只有id和datetime我怀疑您实际上想要加入 大概是这样的:- SELECT SQL_NO_CACHE q1.d1, q1.a, q2.b, (q1.a-q2.

为什么我会受伤

Error in query (1064): Syntax error near 'as q2)' at line 7

我不能在UNION中使用别名吗

更新: 这个查询可能有另一个查询的遗留问题,我首先要理解语法错误

我想计算的是,与昨天相同的时间段相比,今天最后两个小时的点击量增加或减少了两个总和的百分比


该表只有
id
datetime

我怀疑您实际上想要加入

大概是这样的:-

SELECT SQL_NO_CACHE q1.d1, q1.a, q2.b, (q1.a-q2.b)/q1.a*100 as Percentage
FROM 
(
    SELECT Date(date) d1, count(id_update) a 
    FROM vas_updates 
    WHERE date > date_sub(now(), interval 2 hour)  
    GROUP BY DATE(date)
) as q1
INNER JOIN
(
    SELECT date(date) as d2, count(id_update) as b 
    FROM vas_updates 
    WHERE date BETWEEN date_sub(date_sub(now(), interval 1 day), interval 2 hour) AND   date_sub(now(), interval 1 day) 
    group by DATE(d2)  
) as q2
ON q1.d1 = q2.d2
编辑

已检查更新的查询,它是您需要的联接

可以使用交叉连接。您将从每个子查询返回1个值,并对这些值进行计算:-

SELECT SQL_NO_CACHE q1.d1, q1.a, q2.b, (q1.a-q2.b)/q1.a*100 as Percentage
FROM 
(
    SELECT MIN(Date(date)) d1, count(id_update) a 
    FROM vas_updates 
    WHERE date > date_sub(now(), interval 2 hour)
) as q1
CROSS JOIN
(
    SELECT MIN(Date(date)) d2, count(id_update) as b 
    FROM vas_updates 
    WHERE date BETWEEN
    date_sub(date_sub(now(), interval 1 day), interval 2 hour) 
    AND
    date_sub(now(), interval 1 day) 
) as q2

交叉联接提供了行的每个组合。在本例中,您有1条结果记录。我刚刚返回了MIN date以获得要显示的单个日期。

您不能。联合操作不允许在子查询上使用alias,因为它是创建单个表的操作

像这样:

select 1 a, 2 b 
union all
select 3 blah, 4 bleh
这将导致

a     b
1     2
3     4 
请看这里:

在这个查询中,您只有两个字段,不管第二个查询是什么,它只解析第一个字段,检查其他查询是否与第一个查询具有相同数量的字段,以及它们是否属于相同类型。具有alies的联合查询名称无效

所以我认为你需要的可能是一个连接,或者只是所有的字段

因此,您的查询类似于:

SELECT SQL_NO_CACHE tbl.d1, 
                    tbl.a, 
                    tbl.b, 
                    (tbl.a-tbl.b)/tbl.a*100 as Percentage
  FROM  (SELECT Date(date) d1, 
                count(id_update) a,
                null d2,
                null b 
           FROM vas_updates 
          WHERE date > date_sub(now(), interval 2 hour)  
          GROUP BY DATE(date)
         UNION ALL
         SELECT null d1, 
                null a
                date(date) as d2, 
                count(id_update) as b 
           FROM vas_updates 
          WHERE date 
            BETWEEN date_sub(date_sub(now(), interval 1 day), interval 2 hour) 
                AND date_sub(now(), interval 1 day) group by DATE(d2)
         ) tbl
但这很可能不会使计算正确。您可以使用@Kickstart提供的版本

从@Kickstart查询答案

SELECT SQL_NO_CACHE q1.d1, q1.a, q2.b, (q1.a-q2.b)/q1.a*100 as Percentage
FROM 
(
    SELECT Date(date) d1, count(id_update) a 
    FROM vas_updates 
    WHERE date > date_sub(now(), interval 2 hour)  
    GROUP BY DATE(date)
) as q1
INNER JOIN
(
    SELECT date(date) as d2, count(id_update) as b 
    FROM vas_updates 
    WHERE date BETWEEN date_sub(date_sub(now(), interval 1 day), interval 2 hour) AND date_sub(now(), interval 1 day) 
    group by DATE(d2)  
) as q2
ON q1.d1 = q2.d2

我决定用这个答案来解释为什么您以错误的方式使用UNION操作。

我认为@Kickstart是正确的,您可以试试这个

SELECT SQL_NO_CACHE d, a
FROM 
  (SELECT Date(date) d, count(id_update) as a 
   FROM vas_updates 
   WHERE date > date_senter code hereub(now(), interval 2 hour)  
   GROUP BY DATE(date)) 
UNION ALL
  (SELECT date(date) as d, count(id_update) as a 
  FROM vas_updates 
  WHERE date BETWEEN
    date_sub(date_sub(now(), interval 1 day), interval 2 hour) 
    AND
    date_sub(now(), interval 1 day) group by DATE(d2)  )
我错了,更新,你可以这样试试

SELECT SQL_NO_CACHE q1.d1, q1.a, q2.b, (q1.a-q2.b)/q1.a*100 as Percentage
    FROM 
    (
        SELECT  DATE_FORMAT(Date(date),'%H')  as d1, count(id_update) a 
        FROM vas_updates 
        WHERE date > date_sub(now(), interval 2 hour)  
        GROUP BY DATE(date)
    ) as q1
    INNER JOIN
    (
        SELECT  DATE_FORMAT(Date(date),'%H')    as d2, count(id_update) as b 
        FROM vas_updates 
        WHERE date BETWEEN date_sub(date_sub(now(), interval 1 day), interval 2 hour) AND date_sub(now(), interval 1 day) 
        group by DATE(d2)  
    ) as q2
    ON q1.d1 = q2.d2

如果你在那里有正确的格式/缩进,你会看到
)之前的
,因为q2
是悬空的,没有匹配的
。如果删除,它会给我同样的错误:|错误消息似乎与你发布的内容不同,因为在q2
之后没有
,而且它不在第7行。还有一个元问题,您的初始
select
仅适用于您的
select Date(Date)
内部查询,而不是工会的两个查询。queryYou似乎混淆了联合和联合。如果你认为答案是正确的,那么你应该对它进行投票,而不是提供相同的答案(只需稍加修改)。或者至少呈现一些新的内容。我知道了,但如果您使用JOIN,则该选项将永远不起作用,因为日期(d1和d2)永远不会匹配,因为总和来自两个不同的日期。因此,创建一些数据行作为示例,并将其放在a上,然后显示您想要的结果。为你找到解决办法会容易得多。不需要是您的全部数据,只有几行就可以了。请参阅更新的解决方案以获得所需的结果。
SELECT SQL_NO_CACHE q1.d1, q1.a, q2.b, (q1.a-q2.b)/q1.a*100 as Percentage
    FROM 
    (
        SELECT  DATE_FORMAT(Date(date),'%H')  as d1, count(id_update) a 
        FROM vas_updates 
        WHERE date > date_sub(now(), interval 2 hour)  
        GROUP BY DATE(date)
    ) as q1
    INNER JOIN
    (
        SELECT  DATE_FORMAT(Date(date),'%H')    as d2, count(id_update) as b 
        FROM vas_updates 
        WHERE date BETWEEN date_sub(date_sub(now(), interval 1 day), interval 2 hour) AND date_sub(now(), interval 1 day) 
        group by DATE(d2)  
    ) as q2
    ON q1.d1 = q2.d2