Вы можете использовать рекурсию для выполнения проверки чека. Это имеет недостаток в создании фрейма стека для каждого элемента в вашем списке. Если ваш список длинный, это, безусловно, приведет к переполнению стека. LLVM оптимизирует метод Node::back
в цикле (см. LLVM IR, сгенерированный на игровой площадке )
impl Node {
fn back(&mut self) -> &mut Link {
match self.next {
Some(ref mut node) => node.back(),
None => &mut self.next,
}
}
}
impl Recursive {
fn back(&mut self) -> Option<&mut Link> {
self.root.as_mut().map(|node| node.back())
}
}
Используйте JOIN
в инструкции DELETE
.
DELETE p, pa
FROM pets p
JOIN pets_activities pa ON pa.id = p.pet_id
WHERE p.order > :order
AND p.pet_id = :pet_id
В качестве альтернативы вы можете использовать ...
DELETE pa
FROM pets_activities pa
JOIN pets p ON pa.id = p.pet_id
WHERE p.order > :order
AND p.pet_id = :pet_id
... для удаления только из pets_activities
См. http://dev.mysql.com/doc/refman/5.0/en/delete.html
Для удаления одной таблицы, но с ссылочная целостность, есть другие способы делать с EXISTS, НЕ СУЩЕСТВУЕТ, IN, NOT IN и т. д. Но выше, где вы указываете, из каких таблиц, которые нужно удалить с помощью псевдонима перед предложением FROM, может вытащить вас из нескольких довольно жестких пятна легче. Я имею тенденцию обращаться к EXISTS в 99% случаев, а затем есть 1%, где этот синтаксис MySQL занимает день.
Синтаксис выглядит правильно для меня ... попробуйте изменить его, чтобы использовать INNER JOIN ...
Посмотрите на это: http://www.electrictoolbox.com/article / MySQL / кросс-таблицы удалить /
У меня нет базы данных mysql для тестирования на данный момент, но попытались ли вы указать, что нужно удалить до предложения from? Например:
DELETE p, pa FROM `pets` p,
`pets_activities` pa
WHERE p.`order` > :order
AND p.`pet_id` = :pet_id
AND pa.`id` = p.`pet_id`
Я думаю, что используемый вами синтаксис ограничен более новыми версиями mysql.
Для всех, кто читает это в 2017 году, я сделал что-то подобное.
DELETE pets, pets_activities FROM pets inner join pets_activities
on pets_activities.id = pets.id WHERE pets.`order` > :order AND
pets.`pet_id` = :pet_id
Как правило, для удаления строк из нескольких таблиц приведен следующий синтаксис. Решение основано на предположении, что между двумя таблицами существует некоторая взаимосвязь.
DELETE table1, table2 FROM table1 inner join table2 on table2.id = table1.id
WHERE [conditions]
Поскольку это, по-видимому, простое отношение между родителями и дочерними элементами между pets
и pets_activities
, вам было бы лучше создать ограничение внешнего ключа с помощью удаления каскада.
Таким образом, когда pets
удаляется, связанные с ней строки pets_activities
также автоматически удаляются.
Затем ваш запрос становится простым:
delete from `pets`
where `order` > :order
and `pet_id` = :pet_id
Используйте это
DELETE FROM `articles`, `comments`
USING `articles`,`comments`
WHERE `comments`.`article_id` = `articles`.`id` AND `articles`.`id` = 4
или
DELETE `articles`, `comments`
FROM `articles`, `comments`
WHERE `comments`.`article_id` = `articles`.`id` AND `articles`.`id` = 4