关闭sql_mode的only_full_group_的后果是什么?

时间:2019-02-10 17:59:19

标签: mysql

我正在收集SSH暴力数据,并将其存储在名为“ attempts”的表中。我想使用关联的位置数据和国家/地区名称对每个IP地址进行GROUP BY,但是我无法在only_full_group_by启用的情况下执行此操作。我禁用了它,我的查询工作正常,但是我有两个问题:

  1. 禁用only_full_group_by有什么后果?我认为这是默认设置,原因是什么?如果同一IP地址的每个记录的位置数据不同,我可以看到一些问题,但这是唯一出问题的情况吗?

  2. 如果我想在不禁用only_full_group_by的情况下完成查询,该查询将是什么样?

我的代码:

SELECT latitude,longitude,country_name,foreign_ip,g.count as counter
FROM attempts
LEFT OUTER JOIN (
    SELECT COUNT(foreign_ip) as count,foreign_ip as fi
    FROM attempts
    GROUP BY foreign_ip
) as g on attempts.foreign_ip = g.fi
GROUP BY foreign_ip;

2 个答案:

答案 0 :(得分:1)

  

我认为这是默认设置,原因为何?

only_full_group_by禁止以错误的方式使用GROUP BY。默认情况下启用它是一件好事。

您可以编写不带子查询的查询:

SELECT latitude,longitude,country_name, foreign_ip,count(*) as counter
FROM attempts
GROUP BY latitude,longitude,country_name, foreign_ip

答案 1 :(得分:1)

MySQL过去一直非常容忍用户错误。这通常会导致额外的工作(例如,首先存储日期,然后需要对每个选择项过滤无效的日期)和数据丢失(您的列对于数据而言太短,最终导致数据被截断)。他们正在尝试解决此问题,但是他们不能破坏百万个依赖于容忍行为的应用程序,因此解决方案是添加可选的SQL模型。

如果组中的所有列都具有相同的值,那么您没错,什么都不会中断。问题是那不是真的。 MySQL不会警告您,而是只会按组检索任意(甚至不是随机的)行。

您当前的查询可以很容易地修复以在两种模式下工作:

SELECT latitude,longitude,country_name,foreign_ip,g.count as counter
FROM attempts
LEFT OUTER JOIN (
    SELECT COUNT(foreign_ip) as count,foreign_ip as fi
    FROM attempts
    GROUP BY foreign_ip
) as g on attempts.foreign_ip = g.fi
GROUP BY latitude,longitude,country_name,foreign_ip,g.count