1 Востаннє редагувалося Invader (27.02.2013 23:30:48)

Тема: Допоможіть дописати(розібратися в ) запит(і) на оновлення

Ось так нічого не змінює:

mysql> UPDATE green_virtuemart_product_prices AS prices 
SET prices.product_price = ((prices.product_price * 10 / 100) - prices.product_price)
     WHERE prices.virtuemart_product_id = ANY (SELECT virtuemart_category_id FROM green_virtuemart_product_categories    
           WHERE virtuemart_category_id IN(296, 293, 292, 291, 290, 295, 277, 274, 273, 294, 289, 288, 287));
Query OK, 0 rows affected (40.29 sec)
Rows matched: 0  Changed: 0  Warnings: 0

Але ж так:

SELECT virtuemart_category_id 
   FROM green_virtuemart_product_categories 
      WHERE virtuemart_category_id IN(296, 293, 292, 291, 290, 295, 277, 274, 273, 294, 289, 288, 287);

виводить те що потрібно (категорії з вказаними ідентифікаторами).

АЛЕ! Дещо змінений варіанти 1-го запиту на оновлення щось таки змінює:

UPDATE
green_virtuemart_product_prices AS prices 
SET prices.product_price = ((prices.product_price * 10 / 100) - prices.product_price) 
WHERE prices.virtuemart_product_id = ANY
   (SELECT virtuemart_product_id FROM green_virtuemart_product_categories
       WHERE virtuemart_category_id IN(296, 293, 292, 291, 290, 295, 277, 274, 273, 294, 289, 288, 287));

Тільки я не знаю що саме.

2 Востаннє редагувалося User 298 (27.02.2013 23:42:38)

Re: Допоможіть дописати(розібратися в ) запит(і) на оновлення

virtuemart_product_id 

та

virtuemart_category_id 

Ви їх у першому запиті не змішали часом у конструкції WHERE зовнішнього запиту?

WHERE prices.virtuemart_product_id = ANY (SELECT virtuemart_category_id FROM green_virtuemart_product_categories

Бо виходить, що ви номер продукта з категорією порівнюєте...

З.І: поки тестуєте запити оновлення - використовуйте транзакції: безпечніше буде.

3

Re: Допоможіть дописати(розібратися в ) запит(і) на оновлення

А останній ваш запит більш логічно виглядає.

4

Re: Допоможіть дописати(розібратися в ) запит(і) на оновлення

Бо виходить, що ви номер продукта з категорією порівнюєте...

Ну взгалі то я так і намагався зробити. Мабуть я чогось не розумію.
І там обчислення ціни продукта неправильне.

5 Востаннє редагувалося User 298 (28.02.2013 00:04:53)

Re: Допоможіть дописати(розібратися в ) запит(і) на оновлення

Invader написав:

Бо виходить, що ви номер продукта з категорією порівнюєте...

Ну взгалі то я так і намагався зробити. Мабуть я чогось не розумію.
І там обчислення ціни продукта неправильне.

Ну, як обчислити ціну - питання інше: відповідно до вимог завдання.
А говорячи про запити... Порівняння номера категорії із номером продукту, imho, є адекватним лише тоді, коли ці поняття змішані, себто продукти певних номерів виступають категоріями інших.

Якщо ж так і треба, спробуйте замість =ANY

WHERE product_id IN (SELECT ......)

6

Re: Допоможіть дописати(розібратися в ) запит(і) на оновлення

Я пробував і варіант з IN (результат той же), але щойно з’ясував, що ці дві множини не перетинаються. Експерементальним (чи імперичним чи хз) вдалося встановити, що дещо змінений варіант 1-го запиту на оновлення щось таки змінює, і зміню те що потрібно.

7

Re: Допоможіть дописати(розібратися в ) запит(і) на оновлення

Invader написав:

Я пробував і варіант з IN (результат той же), але щойно з’ясував, що ці дві множини не перетинаються. Експерементальним (чи імперичним чи хз) вдалося встановити, що дещо змінений варіант 1-го запиту на оновлення щось таки змінює, і зміню те що потрібно.

Це добре, хоча раз на раз не приходиться.

З.І: якщо можна, опишіть структуру задіяних таблиць (лише основні, задіяні поля) та сутність запиту. Хочеться пересвідчитися, що логіка побудована коректно, бо хтозна, яким чином перетнуться ці множини пізніше...

8 Востаннє редагувалося Invader (28.02.2013 00:39:16)

Re: Допоможіть дописати(розібратися в ) запит(і) на оновлення

ОК

Tables_in_hell                      
+-------------------------------------+
| green_virtuemart_product_categories 
| green_virtuemart_product_prices 


desc green_virtuemart_product_categories;
+------------------------+----------------------+------+-----+---------+-------+
| Field                  | Type                 | Null | Key | Default | Extra |
+------------------------+----------------------+------+-----+---------+-------+
| virtuemart_product_id  | int(1) unsigned      | NO   | PRI | 0       |       |
| virtuemart_category_id | smallint(1) unsigned | NO   | PRI | 0       |       |
| ordering               | int(11)              | NO   |     | 0       |       |
+------------------------+----------------------+------+-----+---------+-------+

desc green_virtuemart_product_prices;
+-----------------------------+------------------+------+-----+---------------------+----------------+
| Field                       | Type             | Null | Key | Default             | Extra          |
+-----------------------------+------------------+------+-----+---------------------+----------------+
| virtuemart_product_price_id | int(11) unsigned | NO   | PRI | NULL                | auto_increment |
| virtuemart_product_id       | int(1) unsigned  | NO   | MUL | 0                   |                |
| virtuemart_shoppergroup_id  | int(11)          | YES  | MUL | NULL                |                |
| product_price               | decimal(15,5)    | YES  |     | NULL                |                |

Що потрібно було:

296, 293, 292, 291,
это категории, ищешь где номера товаров согласно категорий и потом в product price меняешь цену на 10% ниже

9

Re: Допоможіть дописати(розібратися в ) запит(і) на оновлення

Як щодо такого?

UPDATE green_virtuemart_product_prices AS pp
INNER JOIN green_virtuemart_product_categories pc
ON pp.virtuemart_product_id = pc.virtuemart_product_id
SET pp.product_price = pp.product_price*0.9
WHERE pc.virtuemart_category_id IN (296, 293, 292, 291);

10 Востаннє редагувалося Invader (28.02.2013 11:42:29)

Re: Допоможіть дописати(розібратися в ) запит(і) на оновлення

Змінює 1007 рядків. Так само як і мій варіант, але у вас код виглядає чистішим і читабельнішим.

11

Re: Допоможіть дописати(розібратися в ) запит(і) на оновлення

Invader написав:

Змінює 1007 рядків. Так само як і мій варіант, але у вас код виглядає чистішим і читабельнішим.

Ви просто пішли іншим шляхом, універсальнішим. :)