如何在mysql中删除变量行数?

时间:2014-01-16 20:55:34

标签: mysql sql-delete

表格结构

------------
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查询中删除不同用户的可变行数?

1 个答案:

答案 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

最后一个命令生成可以运行的脚本,以删除所有用户的事务。