Jump to content
  • разработка интернет магазинов на opencart
  • доработка интернет магазинов на opencart

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


RGB
 Share

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');
Link to comment
Share on other sites

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')
Link to comment
Share on other sites

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

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')
Link to comment
Share on other sites


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
Link to comment
Share on other sites

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

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

 

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

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.