MYSQL,显示DML语句并按desc出现次数排序



这是我第一次发布问题,很抱歉出现任何格式问题。

我这里有一段代码:代码

但我总是犯一个错误:"在没有GROUP BY的聚合查询中,SELECT列表的表达式#1包含非聚合列'mysql.gener_log.argument';这与sql_mode=only_full_GROUP_BY不兼容">

我想显示general_log文件中的DML语句(SELECT、UPDATE、INSERT、DELETE(,同时按降序排列。

非常感谢的任何反馈

您不需要按分组,只需获取子查询中每个的计数,并在主查询中按其排序即可:

SELECT DDL_STATEMENT, No_of_DDLs 
FROM
(SELECT 'INSERT' as DDL_STATEMENT, COUNT(*) as No_of_DDLs from mysql.general_log
where argument LIKE ('%INSERT%')
UNION
SELECT 'UPDATE' as DDL_STATEMENT, COUNT(*) as No_of_DDLs from mysql.general_log
where argument LIKE ('%UPDATE%')
UNION
SELECT 'SELECT' as DDL_STATEMENT, COUNT(*) as No_of_DDLs from mysql.general_log
where argument LIKE ('%SELECT%')
UNION
SELECT 'DELETE' as DDL_STATEMENT, COUNT(*) as No_of_DDLs from mysql.general_log
where argument LIKE ('%DELETE%')
) t
ORDER BY No_of_DDLs DESC

查询实际上不是很准确,你应该添加更多的验证,比如:

  • 使用UPPER(参数(获取搜索词的所有组合:"SELECT"、"SELECT"、"SELECT"等
  • 排除包含搜索词的单词,例如"SELECTION">
  • 正在删除前导"%",以便获取以搜索词开头的查询。实际上,这个查询的每次执行都会为4个搜索项中的每一个创建一个新的命中:-(