Newsgroup: it.comp.software.database
Titolo: Query Complesse in MYSQL

Buongiorno,
sono abbastanza nuovo di qui, quindi mi scuso fin da ora se non sarò
propriamente chiaro :))))
Ho il seguente problema.
SITUAZIONE :
3 tabelle di cui
1) Nome : CLIENTI
2) Nome : AGENTI
3) Nome : CROSS
Nella tabella CLIENTI ho tutti i dati relativi ai clienti, nella
tabella AGENTI ho tutti i dati relativi agli AGENTI, nella tabella
CROSS ho solamente 2 dati IDAgente e IDCliente.
La tabella CROSS non fa altro che associare qualche cliente è
relazionato a quale agente e viceversa.
Ora, forse l'avrete intuito, vorrei fare in modo che, con un'unica
query, se gli do l'IDAgente dovrebbe verificare cosa gli è collegato
in CROSS e farmi vedere tutti i dati stivati in CLIENTI + Nome e
Cognome dell'agente stivate in AGENTI
Spero di essere stato chiaro.
E già sin da ora, GRAZIE mille dell'attenzione!

 Cognome dell'agente stivate in AGENTI
SELECT A.NOME,A.COGNOME,C.* 
FROM AGENTI AS A LEFT JOIN CROSS ON  A.CHIAVEAGE=CROSS.CHIAVEAGE
LEFT JOIN CLIENTI AS C ON C.CHIAVECLI=CROSS.CHIAVECLI
L'ho scritta a braccio ma teoricamente dovrebbe essere così.

 L'ho scritta a braccio ma teoricamente dovrebbe essere così.
Grazie mille la provo e poi ti faccio sapere :)

 LEFT JOIN CLIENTI AS C ON C.CHIAVECLI=CROSS.CHIAVECLI
A me viene piu' questo:
SELECT
  A.*,
  C.NomeCognomeDescrizioneAgente
FROM CLIENTI A
LEFT JOIN  CROSS B ON (A.idCliente = B.idCliente)
LEFT JOIN AGENTI C ON (B.idCliente = C.idCliente)
WHERE
  C.idAgente = codiceAgenteCheVuoiTu
Alb
-- 
mailto: 
alber...@yahoo.it
 - ICQ: 35062672
http://alb.hey.to
http://web.tiscali.it/albertobaldan/pgp/albald-bigfoot-com.asc

   C.idAgente = codiceAgenteCheVuoiTu
Sembrerebbero non funzionare entrambe. ma forse sbaglio io qualcosa.
Sarebbe di aiuto se postassi i tracciati recordi delle tre tabelle?
Grazie mille ancora!

 Sembrerebbero non funzionare entrambe.
  posta il messaggio di errore e la query che hai eseguito
ed il risultato di:
SHOW CREATE TABLE <nometabella>

 WHERE  C.idAgente = codiceAgenteCheVuoiTu
ho scritto :
SELECT  A.*,  C.Nome, C.Cognome
FROM clienti A
LEFT JOIN  crossing B ON (A.IDCliente = B.IDCliente)
LEFT JOIN agenti C ON (B.IDCliente = C.IDCliente)
WHERE  C.IDCliente = 1
l'errore è #1054 - Unknown column 'C.IDCliente' in 'where clause'
(perchè in effetti non esiste in C (agenti) un IDCliente. Allora ho
cmq provato a sostituire la dicitura IDCliente con IDAgente ma non
produce nessun risultato.
per il SHOW CREATE TABLE mi da
agenti [BLOB - 249 Bytes]
clienti [BLOB - 324 Bytes] 
crossing [BLOB - 211 Bytes] 
Grazie ancora

 
   premi sulla T con le due freccette (<-- T -->)
e posta il risultato, un po' di iniziativa dai ...

 e posta il risultato, un po' di iniziativa dai ...
Ho fatto... ma mi presenta il medesimo risultato postato prima :-? :-?
:-?
Non capisco.
io ho la versione 2.6.0-rc3
Sono confuso? cosa dovrebbe farmi vedere?

Facendolo da linea di comando mi da quanto segue :
-----------------
clienti | CREATE TABLE `clienti` (
  `IDCliente` int(10) unsigned NOT NULL auto_increment,
  `RagSoc` text NOT NULL,
  `Via` text NOT NULL,
  `Cap` text NOT NULL,
  `Loc` text NOT NULL,
  `Prov` text NOT NULL,
  `Tel` text NOT NULL,
  PRIMARY KEY  (`IDCliente`)
) ENGINE=MyISAM;
-----------------
agenti | CREATE TABLE `agenti` (
  `IDAgente` int(11) NOT NULL auto_increment,
  `Nome` text NOT NULL,
  `Cognome` text NOT NULL,
  PRIMARY KEY  (`IDAgente`)
) ENGINE=MyISAM;
-----------------
crossing | CREATE TABLE `crossing` (
  `IDAgente` int(10) unsigned NOT NULL default '0',
  `IDCliente` int(11) NOT NULL default '0'
) ENGINE=MyISAM;
-----------------


prova cosi' (ho rinominato gli alias perche' altrimenti
e' un casino)
SELECT  C.*,  A.Nome, A.Cognome
FROM clienti AS C
LEFT JOIN  crossing AS CR ON (C.IDCliente = CR.IDCliente)
LEFT JOIN agenti AS A ON (A.IDAgente = CR.IDAgente)
WHERE  C.IDCliente = 1

 WHERE  C.IDCliente = 1
Si si, i dati ci sono.
Con la query che mi ha indicato mi trova i dati del cliente ma il nome
e cognome dell'agente me li da come NULL.
Facendo un bel po' di varie prove ho trovato questa che sembrerebbe
funzionare :
SELECT * FROM crossing
INNER JOIN clienti ON (crossing.IDAgente = IDCHEDEVOTROVARE )
AND (crossing.IDCliente = clienti.IDCliente)
Secondo te ci sono controindicazioni? (a parte che così facendo per
via del fatto che uso solo *  nel select nella stessa riga mi trovo 2
volte l'IDCliente)

 
   pensavo cercassi il cliente ... comunque hai tutti gli elementi
per trovare le informazioni che ti servono
   l'unica cosa che ti manca e' una introduzione ad sql
http://www.w3schools.com/sql/sql_intro.asp

 
http://www.w3schools.com/sql/sql_intro.asp
Grazie mille del link!
Ne farò buon uso!
Ma ora mi sto davvero incaprettando a morte e non ne vengo fuori per
fare in modo che mi appaiano solo i dati che voglio :( :( ufff....
O mi vien fuori di tutto, o non mi vien fuori niente :( sconforto e
tristezza! :(