我正在收集SSH暴力数据,并将其存储在名为“ attempts”的表中。我想使用关联的位置数据和国家/地区名称对每个IP地址进行GROUP BY,但是我无法在only_full_group_by启用的情况下执行此操作。我禁用了它,我的查询工作正常,但是我有两个问题:
禁用only_full_group_by有什么后果?我认为这是默认设置,原因是什么?如果同一IP地址的每个记录的位置数据不同,我可以看到一些问题,但这是唯一出问题的情况吗?
如果我想在不禁用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;
答案 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