有选择地删除行mysql

有选择地删除行mysql,mysql,sql,Mysql,Sql,我是mysql的新手,因此希望您能提供以下建议: 我有一个包含3列的表:idkey int、frameint和validbool。Id是关键。当idsrows的有效标志没有从false变为trueit时,我想删除所有idsrows。在一定数量的帧后,idsrows将消失。如果frame在最大framesknown数内未将其有效性从false更改为true,则不会在下一帧更新,因此将失效。Id对于所有帧都是全局唯一的,每个帧有多个Id e、 g.假设id 1在frm 1到5之间为真,在frm 6到

我是mysql的新手,因此希望您能提供以下建议:

我有一个包含3列的表:idkey int、frameint和validbool。Id是关键。当idsrows的有效标志没有从false变为trueit时,我想删除所有idsrows。在一定数量的帧后,idsrows将消失。如果frame在最大framesknown数内未将其有效性从false更改为true,则不会在下一帧更新,因此将失效。Id对于所有帧都是全局唯一的,每个帧有多个Id

e、 g.假设id 1在frm 1到5之间为真,在frm 6到8之间为假,则无效。另一个id 2在frm 1到6之间为true,在frm 7到9之间为false,然后在frm 10到结束之间再次有效。我只想删除第6帧到第8帧之间id 1的行,而不接触id 2

到目前为止,我找到了标记为false的所有id的最后一帧。 将视图更改为false\u pt\u last\u frm as 选择id作为tid,maxframe_编号作为frm,作为ptTable中的vld有效,其中vld=1,按tid分组

然后我考虑将ptTable与视图false\u pt\u last\u frm连接起来,以查找视图中在frm+1帧上有效的所有点,并从视图中查找此集合之外的ID并将其删除。但是我被困在这一点上了


这是一个好方法吗?请举例说明如何有效地做到这一点

我不确定我是否理解正确。但我想你只是想要这个

DELETE FROM <YOUR TABLE> WHERE FRAME = false AND id = <whatever ID you want to target>;
如果没有,请澄清问题,也许

否则可能:

DELETE FROM <YOUR TABLE> WHERE FRAME = false AND id < (SELECT max(id) from <your table>);
甚至

DELETE FROM <YOUR TABLE> WHERE FRAME = false AND id = (SELECT max(id)-1 from <your table>);

如果您希望最新帧之前的帧…

因此,您希望删除一行中三个或更多帧的valid=false序列。第一个问题是确定一行中假值的数量。我们可以使用相关子查询执行此操作:

select t.*,
       ((select count(*) from t t2 where t2.id = t.id and t2.frame <= t2.frame and t2.valid = false) -- num falses before this frame, including this frame +
        (select count(*) from t t2 where t2.id = t.id and t2.frame > t2.frame and t2.valid = false) -- num falses after this frame
       ) as numFalsesInRow
from t
where t.valid = false
第一个子查询统计错误之前的数量,第二个子查询统计错误之后的数量

现在,将其放入联接查询中,如下所示:

delete t
from t inner join
     (select t.*,
             ((select count(*) from t t2 where t2.id = t.id and t2.frame <= t2.frame and t2.valid = false) -- num falses before this frame, including this frame +
              (select count(*) from t t2 where t2.id = t.id and t2.frame > t2.frame and t2.valid = false) -- num falses after this frame
             ) as numFalsesInRow
      from t
      where t.valid = false
    ) t2
    on t.id = t2.id and t.frame = t2.frame and t2.numFalsesInRow = 3;

不过,在执行删除之前,我肯定会测试子查询。

好的,试试这个。它需要MySQL中的临时表。在其他DBMS中可能不是这样:

create table temp as (
    select a.id 
    from ptTable a 
    where a.frame = (
            select max(b.frame) 
            from ptTable b 
            where a.id = b.id) 
    and a.valid = false) ;

delete from ptTable where id in (select id from temp);

谢谢你的回复。我想我的问题有点不同。我需要的是:1。识别有效设置为false和die的ID。2.删除那些错误的帧中的ID。感谢您的回复。我想我需要的是一点不同。关键的是,我只需要删除那些假ID,不管它们假了多长时间,并且再也没有恢复到真的状态,在帧之间删除它们是假的ID。有什么建议吗?嗨,埃文。这些答案解决了你的问题吗?如果是这样的话,最好在上面打勾。这有助于未来的访客,也有利于回答者。