Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql表的SQL公式_Mysql_Sql - Fatal编程技术网

mysql表的SQL公式

mysql表的SQL公式,mysql,sql,Mysql,Sql,您好–我有一个数据库表MySQL版本5.6.41-84.1-log,它有大约92000个条目,其中列用于: id增量唯一id post_类型不重要 post_id不重要,但显示与另一个表的关系 用户id不重要 投票不重要 ip地址,即123.123.123.123 以GMT为单位的投票日期戳,即2018-12-03 04:50:05 我最近举办了一场比赛,我们有一条规则,任何一个IP每天的投票次数不得超过60次。因此,现在我需要运行一个应用以下规则的自定义SQL公式: 对于每个IP地址,如果每天

您好–我有一个数据库表MySQL版本5.6.41-84.1-log,它有大约92000个条目,其中列用于:

id增量唯一id post_类型不重要 post_id不重要,但显示与另一个表的关系 用户id不重要 投票不重要 ip地址,即123.123.123.123 以GMT为单位的投票日期戳,即2018-12-03 04:50:05 我最近举办了一场比赛,我们有一条规则,任何一个IP每天的投票次数不得超过60次。因此,现在我需要运行一个应用以下规则的自定义SQL公式:

对于每个IP地址,如果每天有>60行,则删除这些额外的行


谢谢你的帮助

这是一个复杂的问题,我认为如果没有实际的表格和数据,很难提供100%肯定的答案

然而,让我试着描述一下逻辑,一步一步地构建查询,以便您可以使用它,并可能修复潜在的错误

1我们首先选择在某一天发布超过60张选票的所有ip地址。为此,我们在投票日和ip地址使用group by,并结合having条款

2然后,我们返回表格,选择每个投票日/ip地址对对应的前60个ID。id是一个自动递增的字段,所以我们只使用这个字段和使用mysql limit指令进行排序

    select id, ip_adress, date(voted) as day_voted
    from table 
    where ip_adress, date(voted) in (
        select date(voted), ip_adress 
        from table 
        group by date(voted), ip_adress 
        having count(*) > 60
    ) 
    order by id
    limit 60
3最后,我们再次返回表格,搜索ip地址和投票日期属于上述列表但id大于列表最大id的所有id。这是通过join实现的,需要GROUPBY子句

这将返回我们需要删除的所有ID的列表。在你继续之前测试一下

4最后一步是删除这些ID。mysql中存在一些限制,使得带有子查询条件的删除很难实现。有关技术背景的更多信息,请参阅。您可以使用临时表来存储所选ID,也可以尝试通过包装子查询并对其使用别名来智胜mysql。让我们尝试第二种选择:

delete t.* from table t where id in ( select id from (
    select t1.id 
    from 
        table t1
        join (      
            select id, ip_adress, date(voted) as day_voted 
            from table 
            where ip_adress, date(voted) in (
                select date(voted), ip_adress
                from table 
                group by date(voted), ip_adress
                having count(*) > 60
            )
            order by id
            limit 60
        ) t2 
            on t1.ip_adress = t2.ip_adress
            and date(t1.voted) = t2.day_voted
            and t1.id > max(t2.id)
    group by t1.id
) x );

希望这有帮助

您可以通过大大简化示例数据,并对8.0之前的mysql版本使用行数模拟,或对8.0或更高版本使用窗口函数来实现这一点。在下面的示例中,我假设您不在版本8或更高版本上

drop table if exists t;
create table t(id int auto_increment primary key,ip varchar(2));
insert into t (ip) values
(1),(1),(3),(3),
(2),
(3),(3),(1),(2);

delete t1 from t t1 join
(
select id,rownumber from
(
select t.*,
         if(ip <> @p,@r:=1,@r:=@r+1) rownumber,
         @p:=ip p
from t
cross join (select @r:=0,@p:=0) r
order by ip,id
)s
where rownumber > 2
) a on a.id = t1.id;

有人帮我写了下面的问题,解决了我的问题

SET SQL_SAFE_UPDATES = 0;
create table temp( SELECT id, ip, voted
    FROM
        (SELECT id, ip, voted,
            @ip_rank := IF(@current_ip = ip, @ip_rank + 1, 1) AS ip_rank,
            @current_ip := ip
        FROM `table_name` where ip in (SELECT ip from `table_name` group by date(voted),ip having count(*) >60)
        ORDER BY ip, voted desc
        ) ranked
    WHERE ip_rank <= 2);
DELETE FROM `table_name`
WHERE id not in (select id from temp) and ip in (select ip from temp);
drop table temp;

您运行的是哪个版本的mysql?另外,我删除了phpmyadmin标记,因为这与您的客户端软件无关。首先编写一个select,返回每天超过60行的IP。@jnevil版本的mysql是14.14非常感谢您提供此信息。愚蠢的问题,但我要用我的表名“wp\u voting\u public”替换代码中的哪个变量呢?这就是表。用您的表名wp_voting_public替换它。好的,第一个示例运行良好。第二个错误:在我提供的URL屏幕截图中,将[dot]替换为.OK。mysql中的列别名语法有问题我想我和Oracle合作太多了。修复了查询。感谢您提供此响应。在您的解决方案中,使用我的投票栏,每天规则在哪里实现?在运行SQL命令方面,我是一个绝对的新手,因此,如果我不能理解函数,简化数据集对我来说似乎没有什么好处。另外,我相信我的MySQL版本是5.6.41-84.1-log,已经从phpMyAdmin控制台运行了SELECT版本。
drop table if exists t;
create table t(id int auto_increment primary key,ip varchar(2));
insert into t (ip) values
(1),(1),(3),(3),
(2),
(3),(3),(1),(2);

delete t1 from t t1 join
(
select id,rownumber from
(
select t.*,
         if(ip <> @p,@r:=1,@r:=@r+1) rownumber,
         @p:=ip p
from t
cross join (select @r:=0,@p:=0) r
order by ip,id
)s
where rownumber > 2
) a on a.id = t1.id;
+----+------+
| id | ip   |
+----+------+
|  1 | 1    |
|  2 | 1    |
|  3 | 3    |
|  4 | 3    |
|  5 | 2    |
|  9 | 2    |
+----+------+
6 rows in set (0.00 sec)
SET SQL_SAFE_UPDATES = 0;
create table temp( SELECT id, ip, voted
    FROM
        (SELECT id, ip, voted,
            @ip_rank := IF(@current_ip = ip, @ip_rank + 1, 1) AS ip_rank,
            @current_ip := ip
        FROM `table_name` where ip in (SELECT ip from `table_name` group by date(voted),ip having count(*) >60)
        ORDER BY ip, voted desc
        ) ranked
    WHERE ip_rank <= 2);
DELETE FROM `table_name`
WHERE id not in (select id from temp) and ip in (select ip from temp);
drop table temp;