我试图使用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/

10-11 05:39