MySQL, problema in query complessa

lunedì 29 settembre 2008 - 13.56

squilibrio Profilo | Expert

Ciao a tutti, avrei bisogno del vostro per una query un po' incasinata


Ho due tabelle Master/Detail con un elenco di spedizioni e relativo dettaglio

CREATE TABLE `db`.`webspedizioni` (
`id` int(10) unsigned NOT NULL auto_increment,
`awb` varchar(20) NOT NULL,
`idCliente` int(10) unsigned NOT NULL,
`idWebRubrica` int(10) unsigned NOT NULL,
`destRagioneSociale` varchar(255) NOT NULL,
`destNazione` varchar(255) NOT NULL,
`destIndirizzo` varchar(255) NOT NULL,
`destComune` varchar(255) NOT NULL,
`destProvincia` varchar(255) NOT NULL,
`destCap` varchar(10) NOT NULL,
`destTelefono` varchar(255) NOT NULL,
`destEmail` varchar(255) NOT NULL,
`colli` int(10) unsigned NOT NULL,
`idServizio` int(10) unsigned NOT NULL,
`descrizione` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=238 DEFAULT CHARSET=latin1;



CREATE TABLE `db`.`webspedizionidettaglio` (
`id` int(10) unsigned NOT NULL auto_increment,
`idSpedizioni` int(10) unsigned NOT NULL,
`lunghezza` double NOT NULL,
`altezza` double NOT NULL,
`spessore` double NOT NULL,
`peso` double NOT NULL,
`pesoVolumetrico` double NOT NULL,
`k` double NOT NULL,
`numeroPacco` int(10) unsigned NOT NULL default '0',
PRIMARY KEY (`id`),
KEY `FK_webspedizionidettaglio_1` (`idSpedizioni`),
CONSTRAINT `FK_webspedizionidettaglio_1` FOREIGN KEY (`idSpedizioni`) REFERENCES `webspedizioni` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=415 DEFAULT CHARSET=latin1;


ed una tabella con l'elenco dei destinatari

CREATE TABLE `db`.`webmailingcontatti` (
`id` int(10) unsigned NOT NULL auto_increment,
`idMailing` int(10) unsigned NOT NULL,
`idRubrica` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=latin1;



partendo da un ID passato, corrispondente a webspedizioni.id di una spedizione appena creata (che ovviamente contiene sia master che detail),
voglio creare X spedizioni uguali (con master e detail uguale a quella dell'id passato) ma con X destinatari diversi,
recuperati dalla tabella webmailingcontatti (che verifica una condizione ma questo non è importante), vorrei inserire


la tabella webmailingcontatti si collega alla tabella dei destinatari tramite webmailingcontatti.idRubrica = webrubrica.id


CREATE TABLE `db`.`webrubrica` (
`id` int(10) unsigned NOT NULL auto_increment,
`idWebUtente` int(10) unsigned NOT NULL,
`ragioneSociale` varchar(200) default NULL,
`indirizzo` varchar(200) default NULL,
`cap` varchar(20) default NULL,
`contatto` varchar(200) default NULL,
`telefono` varchar(100) default NULL,
`fax` varchar(100) default NULL,
`email` varchar(200) default NULL,
`cellulare` varchar(100) default NULL,
`comune` varchar(200) default NULL,
`provincia` varchar(200) default NULL,
`nazione` varchar(200) default NULL,
`stato` varchar(200) default NULL,
`domicilioPrivato` tinyint(1) default NULL,
`alias` varchar(200) default NULL,
`piva` varchar(45) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1857 DEFAULT CHARSET=latin1 ROW_FORMAT=FIXED;

Brainkiller Profilo | Guru

>partendo da un ID passato, corrispondente a webspedizioni.id
>di una spedizione appena creata (che ovviamente contiene sia
>master che detail),
>voglio creare X spedizioni uguali (con master e detail uguale
>a quella dell'id passato) ma con X destinatari diversi,
>recuperati dalla tabella webmailingcontatti (che verifica una
>condizione ma questo non è importante), vorrei inserire

E come fai a sapere quali sono gli X destinatari diversi ? Sono sempre gli stessi ?
Se non sono gli stessi come li passi ? Hai una Stored Procedure che esegue il compito o un layer applicativo ? (immagino di sì)
Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

squilibrio Profilo | Expert

Grazie per l'aiuto!!

Gli X destinatari li recupero dalla tabella

webmailingcontatti

in quando ho l'ID della "MailingList" selezionata .... quindi i destinatari sono quelli

Spero sia chiaro, io non so piu dove sbattere la testa con questa query!

squilibrio Profilo | Expert

Nessun aiuto?? Io ho fatto altre prove ma sono sempre in alto mare

Brainkiller Profilo | Guru

>Nessun aiuto?? Io ho fatto altre prove ma sono sempre in alto
>mare

Ho capito vagamente. Allora potresti usare una query del tipo INSERT... SELECT qui documentata:
http://dev.mysql.com/doc/refman/5.0/en/insert-select.html

Questo ti consente di accodare una serie di righe in un'altra tabella.

Quindi tu potresti costruire la query principale joinando la prima spedizione con la distribution list a quel punto ti uscirano N nuove righe tanti quanti sono i contatti e quindi le spedizioni a quel punto fai la INSERT... SELECT di sta roba. Il risultato è che vai ad accodare N nuove spedizioni/righe nella tabella.

Per fare la INSERT...SELECT è necessario che le colonne e i tipi di dati corrispondano.

Ciao

David De Giacomi | <empty>
http://blogs.dotnethell.it/david/

squilibrio Profilo | Expert

Grazie per l'aiuto!! Anche io avevo pensato alla SELECT + INSERT, quello che non riesco a fare è applicarla al mio problema!

Brainkiller Profilo | Guru

>Grazie per l'aiuto!! Anche io avevo pensato alla SELECT + INSERT,
>quello che non riesco a fare è applicarla al mio problema!

INSERT SELECT non SELECT INSERT
Ti consiglio prima di tutto di provare a mettere giù la query così come spiegato nel link di documentazione di MySQL. Ed eseguirla e intanto capire se funziona correttamente e viene inserita la riga.
Usa campi finti:

select 'alfa' as primocampo, 'beta' as secondo ecc.

Una volta appurato questo preparare il JOIN quando è pronto anche lui combini la prima parte e la seconda parte e dovresti ottenere ciò che vuoi.
Ciao

David De Giacomi | <empty>
http://blogs.dotnethell.it/david/
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5