没有GROUP BY子句

时间:2017-03-28 18:14:02

标签: mysql aggregate-functions

我试图使用MySQL来查看元数据。我的目标是查看具有最多属性的表。我有一个表(称为T),它包含table_name和num_att(属性数)列。

当我尝试跑步时 SElECT table_name, MAX(num_att) FROM T; 我错误地认为我必须在我的安装中默认打开的sql_mode=only_full_group_by时有一个GROUP BY语句。 所以,我通过运行SET sql_mode='';关闭了only_full_group_by。这使我可以在不使用group by语句的情况下运行上述查询。

但是,当我运行上面的查询时,它输出错误的数据 - 它输出正确的MAX(num_att)值,但与错误的table_name值组合(它将MAX(num_att)值与第一个table_name值相关联)。

e.g。

SELECT table_name, num_att FROM T;

输出:

+------------+---------+
| table_name | num_att |
+------------+---------+
| customer   | 5       |
| menuitem   | 3       |
| orderdetail| 4       |
| orders     | 7       |
| restaurant | 4       |
+------------+---------+

然后,当我运行聚合查询SElECT table_name, MAX(num_att) FROM T;时,我得到了这个

+------------+---------+
| table_name | num_att |
+------------+---------+
| customer   | 7       |
+------------+---------+

什么时候应该是这个

+------------+---------+
| table_name | num_att |
+------------+---------+
| orders     | 7       |
+------------+---------+

有谁知道为什么会这样? 我在Windows 10 WAMP安装上使用MySQL版本5.7.14而没有更改除密码和sql_mode之外的任何设置(如上所述)。

供参考,T如下:

SELECT table_name,count(column_name) AS num_att 
FROM (
    SELECT table_name,column_name,column_type 
    FROM information_schema.columns AS c
        JOIN (
            SELECT table_schema, table_name 
            FROM information_schema.tables 
            WHERE table_schema='cr'
         ) AS t
    USING (table_name);
) AS x
GROUP BY table_name;

其中cr是我的数据库的名称。

2 个答案:

答案 0 :(得分:1)

如果您需要聚合函数结果和此聚合的值,则无法执行此查询以避免使用组,因此您必须使用子查询(或连接),例如:

SELECT table_name, num_att
FROM T
where num_att = (select max(num_att) from T)

这个功能从mysql 5.7开始..以前的版本也允许使用没有group by的聚合函数...但是group by中的use列是正确的方法..

答案 1 :(得分:0)

您可以将SUBSTRING_INDEX与GROUP_CONCAT技巧

一起使用
SELECT SUBSTRING_INDEX(GROUP_CONCAT(table_name ORDER BY num_att DESC),',',1), MAX(num_att) FROM T