Dubbi su sintassi INNER JOIN

Un saluto a tutti gli amici del forum, devo recuperare dei dati da 4 tabelle e per farlo vorrei utilizzare delle INNER JOIN, sono un po' arrugginito con la sintassi Mysql  pertanto ho bisogno del vostro aiuto, mi illustro brevemente la struttura del database, naturalmente le tabelle sono 4 senza contare la tabella di raccordo.

Le tabelle sono ;

    * accounts;

    * accounts_cstm;

    * opportunities;

    * opportinities_cstm;

    * accounts_opportunities; (tabella di raccordo) con tre colonne id - opportunity_id che relaziona il campo id della tabella opportinities e il campo id_c della tabella opportinities_cstm; account_id che relaziona il campo id della tabella accounts e il campo id_c della tabella accounts_cstm;

io ho la necessità di relazionare le tabelle, ho scritto la query in questo modo

SELECT accounts.id, accounts.name, accounts.billing_address_street, accounts.billing_address_city, accounts.billing_address_state, accounts.billing_address_postalcode, accounts.billing_address_country, accounts.rating, accounts.phone_office, accounts.phone_alternate, accounts_cstm.id_anagrafica_c, accounts_cstm.tipo_pagamento_c, accounts_cstm.data_firma_c, accounts_cstm.quota_associativa_c, accounts_cstm.data_incasso_c, accounts_cstm.piva_c, accounts_cstm.codice_fiscale_c, accounts_cstm.stato_adesione_c, accounts_cstm.data_invio_kit_c, accounts_cstm.stato_kit_associato_c,opportunities_cstm.op_codice_presa
FROM accounts
INNER JOIN accounts_cstm ON accounts.id = accounts_cstm.id_c
INNER JOIN opportunities_cstm ON opportunities.id = opportunities_cstm.id_c

Mi date una mano a capire dove sbaglio ? In effetti nella query non menziono proprio la tabella di raccordo, credo che il problema sia in questo  :'(

inviato 6 anni fa
condor_uk
X 0 X

La "tabella di raccordo" ti dovrebbe servire per fare relazioni tra due tabelle del tipo molti a molti. Non conosco tutto il tuo database e non so come tu voglia rappresentare ciò di cui hai bisogno in un sistema ER.

La sintassi della query mi sembra corretta. Che errore hai?

risposto 6 anni fa
Mario Santagiuliana
X 0 X

La query dice che non trova la colonna op_codice_presa nella tabella opportunities_cstm.op, ma la tabella esiste e anche la colonna, questo lo posso garantire al 100%  "#1054 - Unknown column 'opportunities_cstm.op_codice_presa' in 'field list'".

Penso che sia un problema di relazione, sto davvero sbroccando...Help Me !  :'(

risposto 6 anni fa
condor_uk
X 0 X

Fa il select solamente di quella colonna.

L'errore lo riporta? Sei sicuro sia giusta? Con caratteri a lettere maiuscole e minuscole anche?

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Fa il select solamente di quella colonna.

L'errore lo riporta? Sei sicuro sia giusta? Con caratteri a lettere maiuscole e minuscole anche?

Scusa, ho riscritto la query in modo corretto e l'errore è "#1054 - Unknown column 'opportunities.id' in 'on clause", ti posto la query corretta.

SELECT accounts.id, accounts.name, accounts.billing_address_street, accounts.billing_address_city, accounts.billing_address_state, accounts.billing_address_postalcode, accounts.billing_address_country, accounts.rating, accounts.phone_office, accounts.phone_alternate, accounts_cstm.id_anagrafica_c, accounts_cstm.tipo_pagamento_c, accounts_cstm.data_firma_c, accounts_cstm.quota_associativa_c, accounts_cstm.data_incasso_c, accounts_cstm.piva_c, accounts_cstm.codice_fiscale_c, accounts_cstm.stato_adesione_c, accounts_cstm.data_invio_kit_c, accounts_cstm.stato_kit_associato_c,opportunities_cstm.op_codice_presa_c
FROM accounts
INNER JOIN accounts_cstm ON accounts.id = accounts_cstm.id_c
INNER JOIN opportunities_cstm ON opportunities.id = opportunities_cstm.id_c

Thanks !

risposto 6 anni fa
condor_uk
X 0 X

Non ci siamo. Non hai indicato la tabella opportunities da unire.

In linea generale dei fare così la query:

SELECT *
FROM tabella1 INNER JOIN tabella2 ON tabella1.colonna = tabella2.colonna
INNER JOIN tabella 3 ON tabella1.colonna = tabella3.colonna    #<---o anche tabella2 al posto di tabella1
ecc. ecc.

Se nel tuo modello ER hai una relazione di tipo molti a molti devi utilizzare una tabella esterna a queste che raccolga le loro chiavi primarie.

Forse trovi più semplice creare una query del tipo:

SELECT *
FROM tabella1, tabella2, tabella3 ecc.
WHERE tabella1.colonna = tabella2.colonna AND tabella2.colonna = tabella3.colonna

Facci sapere.

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Allora seguendo i VS consigli sono riuscito a tirare fuori qualcosa, adesso mi manca solo riuscire ad includere nella query la selezione della tabella "opportunity_cstm", posto la query :

SELECT *
FROM accounts
INNER JOIN accounts_cstm ON accounts.id = accounts_cstm.id_c
INNER JOIN accounts_opportunities ON accounts.id = accounts_opportunities.account_id
AND accounts_cstm.id_c = accounts_opportunities.account_id

In sostanza la relazione che devo strutturare in un unica query è questa:

Ogni record della tabella accounts può avere uno o più record nella tabella opportunities;

Ogni record della tabella accounts_cstm può avere uno o più record nella tabella opportunities_cstm;

La tabella ti raccordo si chiama "accounts_opportunity" essa ha tre colonne denominate rispettivamente "id" - "opportunity_id" - "account_id", il campo "id" è autoincrementale e non ha niente a che vedere con le relazioni, il campo "opportunity_id" contiene l'id delle tabelle opportunities e opportunities_cstm, il campo "account_id" contiene l'id delle tabelle accounts e accounts_cstm...

Attendo fiducioso...

risposto 6 anni fa
condor_uk
X 0 X

Il problema sembra essere risolto, posto la query nel caso possa essere di spunto a qualcuno.

SELECT *
FROM accounts
INNER JOIN accounts_cstm ON accounts.id = accounts_cstm.id_c
INNER JOIN accounts_opportunities ON accounts.id = accounts_opportunities.account_id
AND accounts_cstm.id_c = accounts_opportunities.account_id
INNER JOIN opportunities_cstm ON accounts_opportunities.opportunity_id = opportunities_cstm.id_c

A presto e grazie di cuore per l'aiuto.

risposto 6 anni fa
condor_uk
X 0 X

Se la cosa ti funziona va bene così.

Io la sto trovando un po' complicata però...Continuo a non capire se si tratta di relazione uno a molti o molti a molti. La terza tabella mi fa pensare molti a molti. Ma prima inizi con il descrivere una relazione uno a molti.

Inoltre perchè utilizzi un unico campo per la chiave esterna di due tabelle? Non ci trovo il senso...

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Hai ragione, ma stranamente estrae i dati che servono a me. Per il momento mi accontento poi eventualmente la sistemo...  ;)

Thanks

risposto 6 anni fa
condor_uk
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda