Query impossibile...

giovedì 14 giugno 2012 - 11.01

gigimac Profilo | Newbie

L'interrogazione che devo eseguire è la seguente:
"Tutte le coppie di acquirenti che hanno comperato un bene dallo stesso venditore e che si sono scambiati almeno un messaggio di posta privata".

Quindi per spiegare meglio la query io devo ottenere come risultato coppie di acquirenti(che sono e_mail) che hanno acquistato dallo stesso venditore; queste coppie devono scambiarsi almeno un messaggio di posta privata inteso in questo senso:

gigi invia un messaggio a Luca e Luca deve rispondere a gigi...questo record deve essere preso una sola volta,quindi se io nel risultato dovessi avere :

gigi | luca
luca | gigi

io devo prendere solo la prima tupla.

Le tavole in questione sono:

DROP TABLE IF EXISTS 'transazione';
CREATE TABLE IF NOT EXISTS `transazione` (
`Id_transazione` VARCHAR(10) NOT NULL,
`RagioneSociale` VARCHAR(30) NOT NULL,
`E_mailAcquirente` VARCHAR(40) NOT NULL,
`DataAcquisto` DATE NOT NULL,
PRIMARY KEY (`Id_transazione`)
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
ROW_FORMAT=DEFAULT


DROP TABLE IF EXISTS 'riceve';
CREATE TABLE IF NOT EXISTS `riceve` (
`Acquirente` VARCHAR(40) NOT NULL,
`Messaggio` INT(3) NOT NULL,
PRIMARY KEY (`Acquirente`, `Messaggio`),
INDEX `FK_riceve_messaggio` (`Messaggio`),
CONSTRAINT `FK_riceve_acquirente` FOREIGN KEY (`Acquirente`) REFERENCES `acquirente` (`E_mail`)ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT `FK_riceve_messaggio` FOREIGN KEY (`Messaggio`) REFERENCES `messaggio` (`Id_messaggio`)ON UPDATE CASCADE ON DELETE CASCADE
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
ROW_FORMAT=DEFAULT




DROP TABLE IF EXISTS 'messaggio';
CREATE TABLE IF NOT EXISTS `messaggio` (
`Id_messaggio` INT(3) NOT NULL AUTO_INCREMENT,
`Oggetto` VARCHAR(30) NOT NULL,
`Testo` VARCHAR(600) NOT NULL,
`Mittente` VARCHAR(40) NOT NULL,
`Timestamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`Id_messaggio`)
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
ROW_FORMAT=DEFAULT




Io ho fatto in questo modo:


select distinct *
from (
select t1.E_mailAcquirente as Acquirente1, t2.E_mailAcquirente as Acquirente2
from transazione t1, transazione t2
where t1.E_mailAcquirente <> t2.E_mailAcquirente and t1.RagioneSociale = t2.RagioneSociale
) as n
join
(
select Mittente as Acquirente1, Acquirente as Acquirente2
from messaggio m join riceve r on m.Id_messaggio = r.Messaggio
) as n1
on n.Acquirente1 = n1.Acquirente1
where n.Acquirente2 = n1.Acquirente2

Quindi nella prima select faccio il prodotto cartesiano della tabella transazione e mi seleziono tutte le tuple in cui l'acquirente della prima tabella è divera dall'acquirente della seconda tabella e il venditore della prima tabellaè uguale al venditore della seconda tabella.

Nella seconda select mi faccio il join tra la tabella messaggio e riceve e mi seleziono le coppie di mittente e destinatario e le ridenomino sempre come ho fatto nella prima select in Acquirente1 e Acquirente 2 e poi faccio il join dei due risultati .
Il mio problema adesso è che ottengo come risultato anche le coppie di acquirenti che hanno mandato un messaggio ad un acquirente ma l'acquirente che lo ha ricevuto non risponde al mittente e questo non va bene perche npon deve comparire nella tabella del mio risultato.

Spero che qualcuno di buona volontà mi aiuti
Grazie
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-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5