我试图使用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是我的数据库的名称。
答案 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