繁体   English   中英

SQL-根据另一个表中的行数删除行

[英]SQL - Delete row based on number of rows in another table

我将如何基于另一个名为“ replies”的表(使用“ subject_id”列作为引用)在行中的行数从表“ subjects”中删除具有主ID“ subject_id”的行。

伪代码示例:If('subject'的回复少于1个){delete'subject'}

我对SQL触发器了解不多,所以我不知道是否可以将其直接合并到数据库中,或者是否必须编写一些PHP代码来处理这个问题...

要删除没有答复的任何主题,此查询应能解决问题:

DELETE s.* FROM subjects AS s
WHERE NOT EXISTS 
    (
    SELECT r.subject_id
    FROM replies AS r
    WHERE r.subject_id = s.subject_id
    );

演示: DB Fiddle示例

MySQL专家之一需要权衡是否可以直接执行此操作,但是在PHP中,您可以...

$query = "SELECT subject_id FROM subjects WHERE subject='test'";
$return = mysqli_query($mysqli, $query);
$id = mysqli_fetch_assoc($return);

$query = "SELECT reply_id FROM replies WHERE subject_id='".$id[0]."'";
$return = mysqli_query($mysqli, $query);

if(mysqli_num_rows($return) < 1){
    $query = "DELETE FROM subjects WHERE subject_id='1'";
    $return = mysqli_query($mysqli, $query);
}

本示例假定“主题”是唯一的。 换句话说,选择WHERE subject ='test'只会返回一个subject_id。 如果您是定期清理,则将获取所有subject_id值(没有WHERE子句),并循环遍历它们,如果没有答复,则将其删除。

您可以通过从replies表中选择所有(唯一)主题ID,然后删除其中没有答复的所有主题,在一个查询中实现此目的。 使用SELECT DISTINCT ,您不会多次获得ID(如果一个主题有多个答复),因此不会获得不必要的数据。

DELETE FROM subjects 
WHERE subject_id NOT IN (SELECT DISTINCT subject_id FROM replies)

没有回复的任何主题都应删除!

因此,您想删除所有主题而没有回复:

DELETE FROM subjects WHERE subject_id NOT IN 
(SELECT subject_id FROM replies);

我想这就是你想要的...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM