有选择地删除行mysql
我是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并将其删除。但是我被困在这一点上了有选择地删除行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到
这是一个好方法吗?请举例说明如何有效地做到这一点 我不确定我是否理解正确。但我想你只是想要这个
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。有什么建议吗?嗨,埃文。这些答案解决了你的问题吗?如果是这样的话,最好在上面打勾。这有助于未来的访客,也有利于回答者。