2014-01-16 7 views
1

Структура таблицыКак удалить переменное число строк в mysql?

------------ 
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?

+0

Ну, может быть, здесь что-то не хватает, но если те, у кого нет данных, проблема, почему бы вам не удалить их без использования? –

+0

Если я правильно понимаю ваши вопросы, у вас есть пользователи в базе данных, которые имеют число 5, но 8 транзакций в таблице транзакций. Как узнать, какие строки нужно удалить из таблицы транзакций? Это те, у которых самые высокие идентификаторы? – scraatz

+0

О, и если вы собираетесь делать Delete * from SomeTable Limit 10, разместите там заказ –

ответ

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) 

Создать вид из этого оператора выбора:

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 

Последняя команда генерирует скрипт, который вы можете запустить, чтобы удалить транзакцию для всех пользователей.

Смежные вопросы