我试图使用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='';
,我只关闭了“完整”组。这允许我在不使用GROUPBY语句的情况下运行上述查询。
但是,当我运行上面的查询时,它输出错误的数据——它输出正确的MAX(num_att)值,但与错误的table_name值结合在一起(它将MAX(num_att)值与第一个table_name值链接起来)。
例如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 |
+------------+---------+
有人知道为什么会这样吗?
我在Windows10WAMP上使用的是MySQLVersion5.7.14,除了密码和sql模式(如上所述)之外,没有任何其他设置。
作为参考,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是我的数据库的名称。
最佳答案
如果需要聚合函数结果和此聚合的值,则无法执行此查询以避免组被绑定,因此必须使用子查询(或联接),例如:
SELECT table_name, num_att
FROM T
where num_att = (select max(num_att) from T)
这是从mysql 5.7开始的特性。。以前的版本也允许在不使用group by…的情况下使用aggregated函数,但是group by中的use列是正确的。。
关于mysql - MySQL在没有GROUP BY子句的情况下中断,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43076981/