ok cambio i nomi in nomi univoci .....
Grazie![]()
ok cambio i nomi in nomi univoci .....
Grazie![]()
IACO
Scusa piero.mac ......
Ma ci sono delle cose che non capisco.
considerando le due tabelle di prima :
tab1 (articoli) :
modello
tessuto
colore
tab2 (agg_articoli)
agg_modello
agg_tessuto
agg_colore
Faccio ad esempio questa query per trovare tutti i record che sono in entrambe le tabelle.
Mi restituisce due record su 1701.codice:$sql_nuovi="SELECT * FROM agg_articoli, articoli WHERE agg_articoli.agg_modello = articoli.modello AND agg_articoli.agg_tessuto = articoli.tessuto AND agg_articoli.agg_colore=articoli.colore";
E' giusta, in effetti ci sono solo due record uguali fra le due tabelle, che abbiano cioè lo stesso modello, tessuto, colore.
Se provo l'inverso :
Mi vengono fuori risultati ciuccchi 34885 record (cavolo ecco perchè era lento me ne accorgo adesso), mentre avrebbero dovuto essere 1699.codice:$sql_nuovi="SELECT * FROM agg_articoli, articoli WHERE agg_articoli.agg_modello <> articoli.modello AND agg_articoli.agg_tessuto <> articoli.tessuto AND agg_articoli.agg_colore <> articoli.colore";
Sicuramente sbaglio io, le macchine hanno la testa di ferro.
Perchè nel primo caso mi da il risultato giusto, invece nel secondo no ? La logica non è la stessa ?
Quale è la sintassi giusta quando voglio confrontare tre campi per ogni tabella nella mia query ?
Devo per caso usare le unioni esterne ?
ciao![]()
IACO
il secondo ti da un prodotto cartesiano ... uno contro tutti per ogni condizione messa.
Ragionala un attimo...
La prima seleziona i campi in base a tre AND. Massimizziamo il comportamento con indicazioni di fantasia...
prende tutti i dati che corrispondono alla prima condizione where e li mette in una tabella temporanea. Ora applica, a questa ipotetica tabella temporanea, le restrizioni della seconda AND di where e li mette in una seconda ipotetica tabella temporanea. Siamo alla terza condizione che verra' applicata per ottenere il risultato richiesto.
Prova ora a fare lo stesso ragionamento con la tua seconda query e capirai da solo.....
Mette in una tabella temporanea tutti i dati diversi. poi per ogni record mette tutti i dati diversi della seconda condizione, e poi mettera' tutti i dati diversi, per ogni record, della terza condizione... ovunque e' diverso risulta vera la AND.
Credo di essermi spiegato.... In questo caso dovresti usare OR e non AND.
![]()
Il silenzio è spesso la cosa migliore. Pensa ... è gratis.
grazie piero per la risposta![]()
Probabilmente continuo a sbagliare nel ragionamento![]()
Adesso sentito il tuo ragionamento mi torna che AND fosse sbagliato.
Adesso ho provato con OR ma ho lo stesso 37419 record in risposta invece di 1699.
Ma il risultato sarebbe errato anche se facessi semplicemente :
37103 risultati, ma secondo me dovevano essere 1699.codice:$sql="SELECT * FROM agg_articoli, articoli WHERE agg_articoli.agg_modello <> articoli.modello";
A questo punto mi sorge un dubbio ..... io come tipo tabella uso myIsam, è corretto ? Dovrei usare innoDB ?
Devo specificare qualche relazione tra le tabelle ?
Grazie per il tuo aiuto![]()
IACO
Non c'entra la tabella.Originariamente inviato da iaco74
grazie piero per la risposta![]()
Probabilmente continuo a sbagliare nel ragionamento![]()
Adesso sentito il tuo ragionamento mi torna che AND fosse sbagliato.
Adesso ho provato con OR ma ho lo stesso 37419 record in risposta invece di 1699.
Ma il risultato sarebbe errato anche se facessi semplicemente :
37103 risultati, ma secondo me dovevano essere 1699.codice:$sql="SELECT * FROM agg_articoli, articoli WHERE agg_articoli.agg_modello <> articoli.modello";
A questo punto mi sorge un dubbio ..... io come tipo tabella uso myIsam, è corretto ? Dovrei usare innoDB ?
Devo specificare qualche relazione tra le tabelle ?
Grazie per il tuo aiuto![]()
volevo dirtelo che non avrebbe funzionato.... da sempre un prodotto cartesiano ... record 1 contro tutti, record 2 contro tutti... ma volevo farti provare.... Devi precisare quale risultato vuoi ottenere.
Sono sicuro che se ti poni la domanda lo vedrai da te quale potrebbe essere la risposta.
Cosi' chiedi tutti i modelli che nella tabella a sono diversi dalla tabella b. Parti dal primo record e confronta. quindi la domanda e' errata, non la risposta.... non so se mi spiego.
Al limite potevi chiedere tutti i modelli che sono in una tabella ma assenti nell'altra.... ma questo lo sai tu....
![]()
Il silenzio è spesso la cosa migliore. Pensa ... è gratis.
Bene ci sto provando .....
Non e' un problema di tabella.
Molto probabilmente non e' un problema di relazioni.
Ho provato a fare cosi :
$sql="SELECT agg_modello,agg_tessuto,agg_colore FROM agg_articoli, articoli WHERE agg_articoli.agg_modello AND agg_articoli.agg_tessuto AND agg_articoli.agg_colore <> articoli.modello OR articoli.tessuto OR articolo.colore";
La prima parte mi potrebbe anche tornare rifacendomi al ragionamento di prima "primo record contro tutti eccc .
La seconda non mi torna ma per ora e' il massimo che sono riuscito a fare.
Chiaramente ancora non funziona come sai, ma mi ci sto avvicinando, almeno credo.
IACO
manca di logica ... tre campi in AND diversi da tre campi in OR. Tieni presente poi le priorita' .... usando OR sarebbe da valutare un opportuno uso di parentesi.
Ma quello che non capisco e': hai due tabelle. Come e' il rapporto tra queste due tabelle? Dalla tua descrizione si direbbero in rapporto uno ad uno. se fosse cosi' dove sarebbero le diversita'?
Penso invece che ti stai mettendo in una relazione molti a molti.... cioe' dove un articolo puo' avere molti colori e dall'altra un colore puo' essere di molti articoli. E dall'inizio che lo penso, ma niente di meglio che toccare con mano.
ti manca una tabella, definita intermezzo, che ti collega il prodotto articoli in tabella a con la caratteristica del colore in tabella b. La struttura del db che non va in altre parole.
![]()
Il silenzio è spesso la cosa migliore. Pensa ... è gratis.
ok ......
Apparte la struttura adesso ci rifletterò.
Tabella agg_articoli :
Campi
agg_id (primaria)
agg_modello
agg_tessuto
agg_colore
Tabella articoli
id (primaria)
modello
tessuto
colore
Ammettiamo volessi trovare tutti i record che hanno semplicemente un id diverso come dovrei fare ?
Io avevo provato cosi :
$sql="SELECT agg_id FROM agg_articoli WHERE agg_articoli.agg_id <> 'SELECT id from articoli'"
Questa query non mi dovrebbe restituire tutti i record della tabella agg_articoli che hanno un id diverso dalla tabella articoli ?
Invece me li restituisce tutti.
So che sbaglio io ma non capisco dove
IACO
Ammesso ma non concesso che io abbia capito....
in tabella agg_articoli hai i valori
in tabella articoli hai gli id di riferimento ai valori.
dove' la relazione tra queste tabelle?
che hai negli interrogativi....?????codice:agg_id agg_modello agg_tessuto agg_colore 500 lungo satin rosa id modello tessuto colore 1 ???? ???? ????
da come descrivi le tabelle agg_articoli sembrerebbe essere semplicemente una tabella dove fare gli aggiornamenti in attesa di trasferire i dati in articoli.
Il silenzio è spesso la cosa migliore. Pensa ... è gratis.
Esatto sarà proprio cosi.da come descrivi le tabelle agg_articoli sembrerebbe essere semplicemente una tabella dove fare gli aggiornamenti in attesa di trasferire i dati in articoli.
La relazione non c'e'.
Come si fa in mysql a mettere le relazioni ?
In access uso il pannello relazioni, ma in mysql non ho mai usato le relazioni
IACO