Autor Zpráva
martin6541
Profil
Dobrý den.
Potřebuju vyřešit pro mě nadlidský výkon.
Musím v databázi navýšit cenu produktu o 15%, zaokrouhlit na desítky korun, ale informace o výrobcích jsou v jiné tabulce. Je to možné?

Mám tabulku xx_virtuemart_product_prices, kde mám sloupec product_price, který obsahuje cenu bez dph.

Použil bych tedy příkaz, ve kterém vezmu cenu produktu, připočtu DPH, zvednu ji o 15%, vydělím desíti, zaokrouhlím nahoru, vynásobím desíti a odečtu DPH:
UPDATE xx_virtuemart_product_prices SET
product_price = CEIL((product_price*1.21*1,15)/10)*10/1.21;

Ale abych to mohl udělat jen u konkrétního výrobce, tak musím přidat podmínku WHERE. Ale výrobci jsou uvedeni v jiné tabulce. A zde moje začátečnické schopnosti končí.

Mám tabulku xx_virtuemart_product_prices, kde mám sloupec virtuemart_manufacturer a v něm IDčka výrobců.
V obou tabulkách mám také sloupec virtuemart_product_id, podle které to můžu spárovat.

Ale jak? Nebo otázka možná bude znít .. . lze to?
Kajman
Profil
Nestačí Vám něco jako
UPDATE xx_virtuemart_product_prices SET
product_price = CEIL((product_price*1.21*1,15)/10)*10/1.21
WHERE produkt_id IN (SELECT produkt_id FROM produkty WHERE vyrobce='Martin')
;

Hlavně si udělejte zálohu (minimálně měněnou tabulku) a lepší je to nejprve zkoušet na testovacím stroji / databázi.
martin6541
Profil
Kajman:
Jsem se upsal.
Ta druhá tabulka je xx_virtuemart_product_manufacturers
obsahuje sloupec virtuemart_manufacturer_id a virtuemart_produkt_id

takže by to mělo konči takto?
WHERE virtuemart_produkt_id IN (SELECT virtuemart_produkt_id FROM xx_virtuemart_product_manufacturer WHERE virtuemart_manufacturer_id='Martin')
Kajman
Profil
Jestli podmínka funguje dle očekávání, můžete zkusit např. na selectu před updatem.
SELECT virtuemart_produkt_id,
       product_price                              old_price,
       ceil((product_price*1.21*1,15)/10)*10/1.21 new_price
FROM   xx_virtuemart_product_prices
WHERE  virtuemart_produkt_id IN
       (
              SELECT virtuemart_produkt_id
              FROM   xx_virtuemart_product_manufacturer
              WHERE  virtuemart_manufacturer_id='Martin') 
martin6541
Profil
Kajman:
Tak možno Mi je vlstně jedno, jak to bude vypadat, jen když to bude fungovat.

to old_price a new_price tam má opravdu být? Prostě tak jak to je napsáno, tak to použiju?
martin6541
Profil
Zkouším tedy obě verze:
SELECT virtuemart_product_id,
       product_price old_price,
       ceil((product_price * 1.21 * 1,15) / 10) * 10 / 1.21 new_price
FROM j3_virtuemart_product_prices
WHERE virtuemart_product_id IN (SELECT virtuemart_product_id FROM j3_virtuemart_product_manufacturers WHERE virtuemart_manufacturer_id = '51') ;

a

UPDATE j3_virtuemart_product_prices SET
product_price = CEIL((product_price*1.21*1,15)/10)*10/1.21
WHERE virtuemart_product_id IN (SELECT virtuemart_product_id FROM j3_virtuemart_product_manufacturers WHERE virtuemart_manufacturer_id = '51')
;

A obě mi skončí hláškou:
/*Error: "
#21000Operand should contain 1 column(s)" in 1 statement*/
Kajman
Profil
Zkuste 1.15 (s tečkou).
martin6541
Profil
Kajman:
rofl, toho sem si nevšiml :) zkusím


A který z nich je tedy lepší? Nevadí, že jsem z toho vyjmul to old_price a new_price?


/*Result: "87 row(s) affected ( 0,06 sec)" */


Děkuji za spolupráci
Kajman
Profil
martin6541:
A který z nich je tedy lepší?

SELECT - jen vypíše data - tím si ověříte správnost WHERE části
UPDATE - mění data

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0