A geek's diary

blobg

Archivio del 24 ottobre 2008

query corner

venerdì 24 ottobre 2008

Credo che al 99% di voi non capiterà mai di scrivere le query con le quali mi sto intrattenendo, quindi temo che questo post sia soltanto per me. Comunque sia, mentre una query del tipo

INSERT INTO tabella1(attributo1, attributo2, …, attributoN)
SELECT a1, a2, …, an FROM tabella2
ORDER BY a3
ON DUPLICATE KEY UPDATE SET attributo2=tabella2.a2, … attributoN=tabella2.an

funziona perfettamente, se si ha l’esigenza di complicarla leggermente introducendo una join e un ulteriore campo ORDER sulla select, per ottenere qualcosa del tipo

INSERT INTO tabella1(attributo1, attributo2, …, attributoN)
SELECT a1, a2, …, an FROM tabella2 LEFT JOIN tabella3 ON tabella2.riftabella3=tabella3.chiave
ORDER BY a3, tabella3.campo
ON DUPLICATE KEY UPDATE SET attributo2=tabella2.a2, … attributoN=tabella2.an

beh, sappiate che l’ORDER BY aggiuntivo su tabella3.campo manderà in estasi mysql, facendo in modo che l’aggiornamento fatto da ON DUPLICATE KEY sia assolutamente lisergico.

Ho risolto con un cursore, quindi con qualcosa del tipo:

DECLARE var1 varchar(30);
DECLARE var2, var3 double;
[...]
DECLARE done SMALLINT(6) DEFAULT 0;

DECLARE cursore CURSOR FOR SELECT a1, a2, …, an FROM tabella2 LEFT JOIN tabella3 ON tabella2.riftabella3=tabella3.chiave
ORDER BY a3, tabella3.campo;
[...]

set done=0;
OPEN cursore;
WHILE done<>1 DO
FETCH cursore INTO var1, var2, …;
IF done<>1 THEN
INSERT INTO tabella1(attributo1, attributo2, [...])
values(var1, var2, [...])
ON DUPLICATE KEY UPDATE attributo1=var1,
attributo2=var2, [...] ;
END IF;
END WHILE;
CLOSE cursore; SET done=0;

Sapevatelo.

De faccialibrica progressione

venerdì 24 ottobre 2008

Che facebook stia conoscendo un periodo di notevole espansione diventa ogni giorno più evidente. Non so se succede anche a voi, ma io continuo a vedere un flusso quotidiano di gente nuova.