如何删除mysql中的可变行数?

如何删除mysql中的可变行数?,mysql,sql-delete,Mysql,Sql Delete,表结构 ------------ Transaction ------------ id INT PrimaryKey user_id INT ForeignKey amount INT ------------ User ------------ id INT PrimaryKey number INT 事务表包含每个用户的多行,行数存储在user.number中(每个用户的行数不同) 由于程序中的一些错误,在事务表中创建了一些额外的行,但没有增加User.numb

表结构

------------
Transaction
------------
id      INT PrimaryKey
user_id INT ForeignKey
amount  INT

------------
User
------------
id      INT PrimaryKey
number  INT
事务表包含每个用户的多行,行数存储在user.number中(每个用户的行数不同)
由于程序中的一些错误,在事务表中创建了一些额外的行,但没有增加User.number
现在我必须从事务表中删除这些额外的行

据我所知,要删除事务表中的最后10行,我可以运行

DELETE * from Transaction ORDER BY id DESC LIMIT 10;

有没有办法在单个SQL查询中删除不同用户的可变行数?

您可以通过生成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)

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

我可能在这里遗漏了一些内容,但是如果没有用户编号的是一个问题,为什么不删除那些没有usernumber的用户???如果我正确理解了您的问题,那么数据库中的用户在事务表中有5到8个事务。如何知道需要从事务表中删除哪些行?是那些ID最高的吗?哦,如果你打算从某个表中删除*限制10,那么在其中下一个订单在一列中有一个静态的事务总数是一个糟糕的设计。你发布的Delete语句不会删除最后十行。它将删除任意十行。您需要决定要删除哪些行的条件,并在WHERE子句中表示这些行。
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