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