我正在尝试使用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.这使我可以在不使用分组依据语句的情况下运行上述查询。
但是,当我运行上述查询时,它输出了错误的数据——它输出正确的 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 |
+------------+---------+
有谁知道为什么会这样? 我在 Windows 5.7.14 WAMP 安装上使用 MySQL 版本 10,没有更改密码和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 是我的数据库的名称。
如果您需要聚合函数结果和此聚合的值,则无法通过执行此查询,因此必须使用子查询(或连接),例如:
SELECT table_name, num_att
FROM T
where num_att = (select max(num_att) from T)
此功能从MySQL 5.7开始..以前的版本还允许使用聚合函数而无需分组...但是分组依据中的使用列是正确的方式..
你可以用GROUP_CONCAT技巧使用SUBSTRING_INDEX
SELECT SUBSTRING_INDEX(GROUP_CONCAT(table_name ORDER BY num_att DESC),',',1), MAX(num_att) FROM T