A geek's diary

blobg

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.

./mysqltuner.pl

martedì 10 giugno 2008

Per quanti avessero dei mysql in produzione su server *nix, segnalo questo simpatico script che analizza la configurazione e le perfomance del vostro mysql e vi da consigli in merito (con tanto di configurazioni specifiche da mettere in my.cnf).
Perciò vi consiglio:

wget http://mysqltuner.com/mysqltuner.pl
chmod +x mysqltuner.pl
./mysqltuner.pl