表格结构
------------
Transaction
------------
id INT PrimaryKey
user_id INT ForeignKey
amount INT
------------
User
------------
id INT PrimaryKey
number INT
事务表包含每个用户的多行,行数存储在User.number中(每个用户都不相同)
由于程序中的一些错误,在Transaction表中创建了一些额外的行而没有增加User.number
现在我必须从Transaction表中删除那些额外的行。
据我所知,要删除Transaction表中的最后10行,我可以运行
DELETE * from Transaction ORDER BY id DESC LIMIT 10;
有没有办法在单个SQL查询中删除不同用户的可变行数?
答案 0 :(得分:1)
您可以通过生成SQL脚本来删除其他事务来执行此操作:
您应该能够找到以下用户:
SELECT user.id AS user_id, COUNT(transaction.id)-user.number AS num_trans FROM user, transaction WHERE user.id=transaction.user_id GROUP BY user.id, user.number HAVING user.number < COUNT(transaction.id)
从此select语句创建一个视图:
CREATE VIEW invalidusers AS
SELECT user.id AS user_id, COUNT(transaction.id)-user.number AS num_trans FROM user, transaction WHERE user.id=transaction.user_id GROUP BY user.id, user.number HAVING user.number < COUNT(transaction.id)
检查此视图的输出。
现在从此视图中选择要执行的脚本:
SELECT CONCAT('DELETE * FROM transaction WHERE user_id=', CONVERT(user_id, CHAR), ' ORDER BY id DESC LIMIT ', CONVERT(num_trans, CHAR), ';') AS CMD from invalidusers
最后一个命令生成可以运行的脚本,以删除所有用户的事务。