2017-06-01 61 views
0

我试图用我的UNION的组合ORDER BY表达,我收到错误ORDER BY的应用ORDER BY到UNION MYSQL

“表达式#1包含聚合函数,并适用于联盟”。

(SELECT 'SELECT' AS argument, count(argument) FROM mysql.general_log WHERE 
argument LIKE ("SELECT%")) 
UNION 
(SELECT 'INSERT' AS argument, count(argument) FROM mysql.general_log WHERE 
argument LIKE ("INSERT%")) 
UNION 
(SELECT 'UPDATE' AS argument, count(argument) FROM mysql.general_log WHERE 
argument LIKE ("UPDATE%")) 
UNION 
(SELECT 'DELETE' AS argument, count(argument) FROM mysql.general_log WHERE 
argument LIKE ("DELETE%")) 
ORDER BY count(argument) ASC; 

回答

0

正确的语法是

select * from 
(query 1 union query 2 union query 3...) 
order by x 

编辑

你还缺少计数和外部查询的别名。最后的查询应该是这样的

这足以让我在rextester上设置一个工作示例。

SELECT argument, cnt from 
(
    (SELECT 'SELECT' AS argument, count(argument) as CNT FROM mysql.general_log WHERE 
    argument LIKE ("SELECT%")) 
    UNION 
    (SELECT 'INSERT' AS argument, count(argument) FROM mysql.general_log WHERE 
    argument LIKE ("INSERT%")) 
    UNION 
    (SELECT 'UPDATE' AS argument, count(argument) FROM mysql.general_log WHERE 
    argument LIKE ("UPDATE%")) 
    UNION 
    (SELECT 'DELETE' AS argument, count(argument) FROM mysql.general_log WHERE 
    argument LIKE ("DELETE%")) 
) aa 
ORDER BY cnt ASC; 

有一个更简单的解决方案虽然,你可以使用,因为参数都相同的长度:

select substring(upper(argument), 1, 6) as argument, count(*) as cnt 
from mysql.general_log 
group by substring(upper(argument), 1, 6) 
order by cnt asc; 

你可以看到,在行动中我上面

联同rextester
+0

嗨,我迎接错误“每个派生表必须有它自己的别名” – Sailthor

+0

感谢,但类似的错误“ORDER BY的表达式1包含聚合函数并适用于非聚合查询的结果” – Sailthor

+0

这样做工作,非常感谢。为什么MySql要求我们使用这个别名? – Sailthor