Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

[Решено] Один sql-запрос для удаления всех товаров по условию


RGB

Recommended Posts

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

Я смог скомпоновать запрос, используя модель из модуля фильтра товаров в админке, получилось вот так (мультиязычность и префиксы убрал, так как у меня этого не нужно):

SELECT p.product_id FROM product p LEFT JOIN product_description pd ON (p.product_id = pd.product_id) LEFT JOIN manufacturer m ON (p.manufacturer_id = m.manufacturer_id) LEFT JOIN product_to_category p2c ON (p.product_id = p2c.product_id) WHERE p2c.category_id = '100' AND p.manufacturer_id = '50';

т.е. здесь выводятся ид всех товаров производителя 50 из категории 100. Для удаления есть запросы из ф-ции deleteProduct, которую вы все знаете

		$this->db->query("DELETE FROM " . DB_PREFIX . "product WHERE product_id = '" . (int)$product_id . "'");
		$this->db->query("DELETE FROM " . DB_PREFIX . "product_attribute WHERE product_id = '" . (int)$product_id . "'");
		$this->db->query("DELETE FROM " . DB_PREFIX . "product_description WHERE product_id = '" . (int)$product_id . "'");
		$this->db->query("DELETE FROM " . DB_PREFIX . "product_discount WHERE product_id = '" . (int)$product_id . "'");
		$this->db->query("DELETE FROM " . DB_PREFIX . "product_image WHERE product_id = '" . (int)$product_id . "'");
		$this->db->query("DELETE FROM " . DB_PREFIX . "product_option WHERE product_id = '" . (int)$product_id . "'");
		$this->db->query("DELETE FROM " . DB_PREFIX . "product_option_value WHERE product_id = '" . (int)$product_id . "'");
		$this->db->query("DELETE FROM " . DB_PREFIX . "product_related WHERE product_id = '" . (int)$product_id . "'");
		$this->db->query("DELETE FROM " . DB_PREFIX . "product_related WHERE related_id = '" . (int)$product_id . "'");
		$this->db->query("DELETE FROM " . DB_PREFIX . "product_reward WHERE product_id = '" . (int)$product_id . "'");
		$this->db->query("DELETE FROM " . DB_PREFIX . "product_special WHERE product_id = '" . (int)$product_id . "'");
		$this->db->query("DELETE FROM " . DB_PREFIX . "product_to_category WHERE product_id = '" . (int)$product_id . "'");
		$this->db->query("DELETE FROM " . DB_PREFIX . "product_to_download WHERE product_id = '" . (int)$product_id . "'");
		$this->db->query("DELETE FROM " . DB_PREFIX . "product_to_layout WHERE product_id = '" . (int)$product_id . "'");
		$this->db->query("DELETE FROM " . DB_PREFIX . "product_to_store WHERE product_id = '" . (int)$product_id . "'");
		$this->db->query("DELETE FROM " . DB_PREFIX . "review WHERE product_id = '" . (int)$product_id . "'");

Так вот, вопрос - как можно (и возможно ли вообще) объединить все эти делиты в один (у меня MySQL новее 4), чтобы не дублировать в условии для каждого из них верхний селект, а указать одно общее условие:

WHERE ... IN (SELECT p.product_id FROM product p LEFT JOIN product_description pd ON (p.product_id = pd.product_id) LEFT JOIN manufacturer m ON (p.manufacturer_id = m.manufacturer_id) LEFT JOIN product_to_category p2c ON (p.product_id = p2c.product_id) WHERE p2c.category_id = '100' AND p.manufacturer_id = '50');
Надіслати
Поділитися на інших сайтах


DELETE t1, t2, t3, ..., tn FROM product t1

LEFT JOIN product_to_category t2 ON(t1.product_id=t2.product_id)

LEFT JOIN product_to_store t3 ON(t1.product_id=t3.product_id)

..

LEFT JOIN product_attribute tn(t1.product_id=tn.product_id)

WHERE t1.product_id=9276

  • +1 1
Надіслати
Поділитися на інших сайтах

DELETE t1, t2, t3, ..., tn FROM product t1
LEFT JOIN product_to_category t2 ON(t1.product_id=t2.product_id)
LEFT JOIN product_to_store t3 ON(t1.product_id=t3.product_id)
..
LEFT JOIN product_attribute tn(t1.product_id=tn.product_id)
WHERE t1.product_id=9276

 

Спасибо, но разве можно так делать? Я имею в виду DELETE t1 FROM product t1  

sql ругается 

 

#1093 - You can't specify target table 't1' for update in FROM clause

 

Запрос ввожу такой:

DELETE t1, t2, ... t15 
FROM product t1
LEFT JOIN product_attribute t2 ON(t1.product_id=t2.product_id)
LEFT JOIN product_description t3 ON(t1.product_id=t3.product_id)
...
LEFT JOIN review t15 ON(t1.product_id=t15.product_id)
WHERE t1.product_id IN (SELECT t1.product_id FROM product t1 LEFT JOIN product_description t3 ON (t1.product_id = t3.product_id) LEFT JOIN manufacturer m ON (t1.manufacturer_id = m.manufacturer_id) LEFT JOIN product_to_category t11 ON (t1.product_id = t11.product_id) WHERE t11.category_id = '146' AND t1.manufacturer_id = '49')
Надіслати
Поділитися на інших сайтах

запрос полностью укажите, без троеточий

DELETE t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15 FROM product t1
LEFT JOIN product_attribute t2 ON(t1.product_id=t2.product_id)
LEFT JOIN product_description t3 ON(t1.product_id=t3.product_id)
LEFT JOIN product_discount t4 ON(t1.product_id=t4.product_id)
LEFT JOIN product_image t5 ON(t1.product_id=t5.product_id)
LEFT JOIN product_option t6 ON(t1.product_id=t6.product_id)
LEFT JOIN product_option_value t7 ON(t1.product_id=t7.product_id)
LEFT JOIN product_related t8 ON(t1.product_id=t8.product_id)
LEFT JOIN product_reward t9 ON(t1.product_id=t9.product_id)
LEFT JOIN product_special t10 ON(t1.product_id=t10.product_id)
LEFT JOIN product_to_category t11 ON(t1.product_id=t11.product_id)
LEFT JOIN product_to_download t12 ON(t1.product_id=t12.product_id)
LEFT JOIN product_to_layout t13 ON(t1.product_id=t13.product_id)
LEFT JOIN product_to_store t14 ON(t1.product_id=t14.product_id)
LEFT JOIN review t15 ON(t1.product_id=t15.product_id)
WHERE t1.product_id IN (SELECT t1.product_id FROM product t1 LEFT JOIN product_description t3 ON (t1.product_id = t3.product_id) LEFT JOIN manufacturer m ON (t1.manufacturer_id = m.manufacturer_id) LEFT JOIN product_to_category t11 ON (t1.product_id = t11.product_id) WHERE t11.category_id = '146' AND t1.manufacturer_id = '49')
Надіслати
Поділитися на інших сайтах


DELETE t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15

FROM product t1

LEFT JOIN product_attribute t2 ON(t1.product_id=t2.product_id)

LEFT JOIN product_description t3 ON(t1.product_id=t3.product_id)

LEFT JOIN product_discount t4 ON(t1.product_id=t4.product_id)

LEFT JOIN product_image t5 ON(t1.product_id=t5.product_id)

LEFT JOIN product_option t6 ON(t1.product_id=t6.product_id)

LEFT JOIN product_option_value t7 ON(t1.product_id=t7.product_id)

LEFT JOIN product_related t8 ON(t1.product_id=t8.product_id)

LEFT JOIN product_reward t9 ON(t1.product_id=t9.product_id)

LEFT JOIN product_special t10 ON(t1.product_id=t10.product_id)

LEFT JOIN product_to_category t11 ON(t1.product_id=t11.product_id)

LEFT JOIN product_to_download t12 ON(t1.product_id=t12.product_id)

LEFT JOIN product_to_layout t13 ON(t1.product_id=t13.product_id)

LEFT JOIN product_to_store t14 ON(t1.product_id=t14.product_id)

LEFT JOIN review t15 ON(t1.product_id=t15.product_id)

WHERE t11.category_id = '146' AND t1.manufacturer_id = '49'

  • +1 2
Надіслати
Поділитися на інших сайтах

в фильтре товаров это же действие занимает пару кликов кстати. чем не удобно?

Я стремлюсь к максимальной автоматизации :) Это если одна или несколько категорий и производителей, то все просто, но дилеры обычно работают с десятками брендов, которые к тому же представлены товарами в десятках или даже сотнях категорий. Например, после очередной ревизии списка дилеров я пометил на удаление штук 30 брендов из полутора сотен категорий - можно конечно посидеть пару часов в админке с фильтром и все почистить, но контент-менеджеры могут снова ошибочно добавить товары этих брендов (контролировать это сложно из-за большого ассортимента), тогда опять придется тоже самое делать.

 

А с шаблоном вашего запроса можно один раз посидеть эти же пару часов, проставить ид всех категорий и производителей (они не будут меняться, разве что новые добавятся, но их не будет много), и после каждого крупного обновления применять этот запрос для очистки базы от мусора.

Надіслати
Поділитися на інших сайтах

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз

×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.