Aiutino per Trigger | SQL & MySQL

Topic: Pubblico - Composto da 10 Posts di 2 Utenti.

19 Luglio, 2010 09:38 #1
lasslo
Utente

lasslo
Registrato: Jul, 2010
Posts: 5
Offline

Salve ragazzi, io ho il seguente problema:

Sto creando una piattaforma e-commerce e il CMS che utilizzo crea determinate tabelle. Per importare i prodotti all'interno del database mysql, (le categorie e l'ID_categoria di ogni prodotto) utilizzo un file .csv . Attraverso questo CSV vengono create tre tabelle. 

tabella1: id-categoria, nome-categoria
tabella2: id-categoria e id-prodotto
tabella3: id-prodotto e nome-categoria


Ora il database è pieno di prodotti e tutte le tabelle sono piene con i rispettivi dati (nome-categoria, id-categoria, id-prodotto). Quando però andrò ad importare nuovi prodotti, nella tabella2 il campo id-prodotto rimarrà vuoto perchè non è specificato alcun valore nel csv da importare. 


Ho provato a creare un Trigger per:
- prendere il campo nome-categoria dalla tabella3 durante l'import del csv con i dati dei prodotti
- associare ad una variabile numerica il campo id-categoria quando i campi nome-categoria della tabella1 e della tabella3 sono uguali
-inserire il valore della variabile numerica succitata nel campo id-categoria della tabella2


Questo il codice che no ottenuto:



 

Codice :

 

CREATE TRIGGER triggeridcat

AFTER INSERT ON jos_vm_product

FOR EACH ROW

DECLARE a NUMBER;

BEGIN

SELECT category_id INTO x FROM jos_vm_category WHERE category_name=:NEW.attribute;UPDATE jos_vm_product_category_xref SET category_id=x WHERE product_sku=:NEW.product_sku;

END;

 

 

ma mi rileva errore di sintassi...


Qualcuno può aiutarmi?

 

Ultima modifica 19 Luglio, 2010 09:40 di lasslo

19 Luglio, 2010 11:06 #2
g2d
Moderatore

g2d
Registrato: Jul, 2008
Posts: 957
Offline
Segui g2d su Twitter!

Ciao lasslo

Benvenuto su MySQL Italia,

 

allora a occhio vedo un paio di errori di sintassi

 

la riga DECLARE a NUMBER; devi inserirla dopo BEGIN

poi

SELECT category_id INTO x FROM jos_vm_category WHERE category_name=:NEW.attribute;

questo INTO non sintassi della select ma della INSERT

 

e poi :NEW.attribute ? di cosa si tratta ?

 

In una select mi è nuovo, però potrei sbagliarmi, dimmi tu

 

saluti algweb

 

 

 


Un tempo ero algweb ora sono g2d

21 Luglio, 2010 09:17 #3
lasslo
Utente

lasslo
Registrato: Jul, 2010
Posts: 5
Offline

Ciao, grazie di aver risposto. Mi stai dicendo che il codice esatto è:

 

CREATE TRIGGER triggeridcat

AFTER INSERT ON jos_vm_product

FOR EACH ROW

BEGIN

DECLARE a NUMBER;

SELECT category_id INSERT INTO x FROM jos_vm_category WHERE category_name=attribute;UPDATE jos_vm_product_category_xref SET category_id=x WHERE product_sku=product_sku;

END;

21 Luglio, 2010 09:26 #4
g2d
Moderatore

g2d
Registrato: Jul, 2008
Posts: 957
Offline
Segui g2d su Twitter!

No assolutamente,

Questa query è sbagliata

SELECT category_id INSERT INTO x FROM jos_vm_category WHERE category_name=attribute;


non è ne una select ne una INSERT, spiegami un pò meglio la tua esigenza che ci ragioniamo assieme e scriviamo meglio questa query

 

Saluti algweb


Un tempo ero algweb ora sono g2d

21 Luglio, 2010 10:33 #5
lasslo
Utente

lasslo
Registrato: Jul, 2010
Posts: 5
Offline

Ho bisogno di importare un CSV .

Con l'import di questo CSV viene creata una tabella tra i quali campi ci sono IDprodotto e NOMEcategoria. 

Nel database è presente un'altra tabella nella quale sono presenti i campi IDcategoria e NOMEcategoria.

Ad ogni NOMEcategoria è assegnato un valore numerico univoco nel campo IDcategoria.

Esiste anche una tabella nella quale ad ogni IDprodotto (valore univoco) è accostato un IDcategoria (in un'altra colonna della stessa tabella). il campo IDcategoria in questa tabella è vuoto dato che non è presente nel CSV.

Quello che mi serve è riempire il campo IDcategoria di quest'ultima tabella con il valore numerico che corrisponde a quello che è presente nella tabella che associa il nome della categoria ad un numero.

In pratica mi serve che il trigger:

-legga il campo NOMEcategoria del CSV

-lo confronti con il campo NOMEcategoria della tabella con IDcategoria e NOMEcategoria

-prenda il valore IDcategoria e lo inserisca nel campo vuoto della tabella IDprodotto e IDcategoria nella riga che corrisponde al prodotto di turno (andando a confrontare il campo IDprodotto con lo stesso presente nel CSV)

 

Saluti 

Lorenzo Sinisi

21 Luglio, 2010 13:34 #6
g2d
Moderatore

g2d
Registrato: Jul, 2008
Posts: 957
Offline
Segui g2d su Twitter!

Ciao Lassio

 

Se ho capito bene in effetti devi fare qualcosa del genere

 

UPDATE Tabella_prodotti SET

IdCategoria= (SELECT IdCategoria FROM Tabella_prodotti AS A JOIN Tabella_Categ AS B ON A.NomeCategoria = B.NomeCategoria order by IDProdotto desc LIMIT1 )

 

che ne pensi ?


Non sono sicurissimo dei nomi dei tuoi campi e/o tabelle, ho scritto quindi una query con nomi di fantasia, per farti capire il ragionamento che ho fatto.

 

Fammi sapere e Grazie

 

Saluti algweb


Un tempo ero algweb ora sono g2d

22 Luglio, 2010 09:54 #7
lasslo
Utente

lasslo
Registrato: Jul, 2010
Posts: 5
Offline

Ciao algweb

 

Grazie della risposta ma credo che ci sia un errore nella tua formula. Potresti spiegarla verbalmente? Così posso dirti dove penso sia sbagliata.

22 Luglio, 2010 18:30 #8
g2d
Moderatore

g2d
Registrato: Jul, 2008
Posts: 957
Offline
Segui g2d su Twitter!

Ciao lassio,

 

certo, scusami se non sono stato velocissimo nella risposta.

 

In effetti io faccio l'update del solo campo IDCATEGORIA della tabella prodotti e lo faccio uscire selezionandolo dalla join TabProdotti e TabCategorie.

Sulla record della tabella prodotto che prendi dal CSV c'è il nome della categoria o sbaglio ?

L'ordinamento desc mi serve per prendere l'ultimo prodotto, e limito a 1 per prenderne uno solo ....

che ne pensi ?

Se pensi che non funzioni passami le 2 create table e un paio di righe del csv così posso fare delle prove.

 

Ho visto che hai provato gravatar.... è un servizio straordinario..

 

Fammi sapere

 

saluti algweb

 


Un tempo ero algweb ora sono g2d

26 Luglio, 2010 09:09 #9
lasslo
Utente

lasslo
Registrato: Jul, 2010
Posts: 5
Offline

Ciao Algweb, mi scuso per il ritardo nella risposta ma sono stato fuori città nel weekend. Ecco il file .zip contentente il file sql con le tre tabelle in questione. http://hotfile.com/dl/57594953/d80bfd0/database.rar.html

 

 

saluti

Lorenzo Sinisi

 

26 Luglio, 2010 19:23 #10
g2d
Moderatore

g2d
Registrato: Jul, 2008
Posts: 957
Offline
Segui g2d su Twitter!

Ciao Lassio,

Stai tranquillo per il ritardo, spero che tu ti sia divertito nel week end, le ferie ormai sembrano vicine.... finalmente!!!

Andiamo alla nostra query, beh io ho scaricato il DUMP e restorato le 3 tabelle, però ho da farti due osservazioni:

 

La prima riguarda i precedenti post, mi dicevi di una tabella3: id-prodotto e nome-categoria  ma in effetti non c'è.


La seconda riguarda i dati, io temo che tu sia stato tratto in inganno dai dati, mi spiego se fai la seguente query


SELECT * FROM jos_vm_product_category_xref AS B JOIN jos_vm_category as C on B.category_id = C.category_id

 

Con questa query appunti dovresti recuperare tutti i campi, compreso product_id e nomecateg delle categorie presenti in jos_vm_category, il problema è che quelle categorie non corrispondono a quelli della tabella di associazione jos_vm_product_category_xref, quindi magari non ti accorgerai mai che stai facendo bene la query.

Dimmi tu a questo punto come vuoi procedere, se ritieni, possiamo anche popolare la tabella con dati esempio, corretti.

Grazie, saluti  algweb

 


Un tempo ero algweb ora sono g2d

Condividi su:

Loggati o Registrati per replicare