View Full Version : [SQL] join con più campi da una sola tabella
Ciao, ho un problema con una join.
Ho una tabella in cui c'è un campo con l'id di una squadra in casa, e l'id di una squadra in trasferta...
ovviamente poi dovrei andare a pescare i dati per la join dalla stessa tabella, solamente che ottengo l'errore
#1066 - Tabella/alias non unico: 'squadre'
come posso risolvere?
Ciao, ho un problema con una join.
Ho una tabella in cui c'è un campo con l'id di una squadra in casa, e l'id di una squadra in trasferta...
ovviamente poi dovrei andare a pescare i dati per la join dalla stessa tabella, solamente che ottengo l'errore
#1066 - Tabella/alias non unico: 'squadre'
come posso risolvere?
Non ho capito. Che informazione vorresti ottenere dalla query? Tutte le squadre che...?
Non ho capito. Che informazione vorresti ottenere dalla query? Tutte le squadre che...?
cerco di spegare meglio, io ho una tabella partite con campi giornata, casa e trasferta (questi ultimi 2 contengono l'id della squadra)
poi ho una tabella squadre in cui ho l'id e il relativo nome.
Io vorrei stampare il calendario, ottenendo tutti i dati (giornata, e nomi delle due squadre) in una sola query.
SELECT * FROM partite
INNER JOIN (tipopartite,squadre,squadre)
ON (tipopartite.id=partite.tipo, squadre.id=partite.casa, squadre.id=partite.fuori)
WHERE giornata =1
questo è il codice che vorrei usare per ottenere i dati della prima giornata, solamente che avendo due campi squadre ottengo l'errore
secondo me dovresti creare 2 alias della stessa tabella, una per esempio per i "fuori casa" e una per gli "in casa" così:
SELECT a.squadra, b.squadra FROM partite a, partite b
quindi fare la join usando gli alias della tabella sostituiendo con a e b il nome della tabella
[QUOTE=wisher]cerco di spegare meglio, io ho una tabella partite con campi giornata, casa e trasferta (questi ultimi 2 contengono l'id della squadra)
poi ho una tabella squadre in cui ho l'id e il relativo nome.
Io vorrei stampare il calendario, ottenendo tutti i dati (giornata, e nomi delle due squadre) in una sola query.
SELECT * FROM partite
INNER JOIN (tipopartite,squadre,squadre)
ON (tipopartite.id=partite.tipo, squadre.id=partite.casa, squadre.id=partite.fuori)
WHERE giornata =1
Puoi postare i nomi dei campi delle 2 tabelle?
cerco di spegare meglio, io ho una tabella partite con campi giornata, casa e trasferta (questi ultimi 2 contengono l'id della squadra)
poi ho una tabella squadre in cui ho l'id e il relativo nome.
Io vorrei stampare il calendario, ottenendo tutti i dati (giornata, e nomi delle due squadre) in una sola query.
SELECT * FROM partite
INNER JOIN (tipopartite,squadre,squadre)
ON (tipopartite.id=partite.tipo, squadre.id=partite.casa, squadre.id=partite.fuori)
WHERE giornata =1
questo è il codice che vorrei usare per ottenere i dati della prima giornata, solamente che avendo due campi squadre ottengo l'errore
Non capisco perchè vuoi fare una inner join.
Una cosa così non funziona?
select par.campo,
par.giornata,
( select s1.squadra from squadre s1 where s1.id = par.casa ) as squadra1 ),
( -- stessa cosa per la squadra in trasferta... )
from partite par
where par.giornata = 1;
Forse non ho capito bene la tua situazione però.
secondo me dovresti creare 2 alias della stessa tabella, una per esempio per i "fuori casa" e una per gli "in casa" così:
SELECT a.squadra, b.squadra FROM partite a, partite b
quindi fare la join usando gli alias della tabella sostituiendo con a e b il nome della tabella
Grazie della risposta, però nn mi è chiaro in che modo creare un'alias...
Non capisco perchè vuoi fare una inner join.
Una cosa così non funziona?
select par.campo,
par.giornata,
( select s1.squadra from squadre s1 where s1.id = par.casa ) as squadra1 ),
( -- stessa cosa per la squadra in trasferta... )
from partite par
where par.giornata = 1;
Forse non ho capito bene la tua situazione però.
grazie anche a te per la risposta, adesso provo il tuo codice, comunque la JOIN nn è indispensabile, anzi...
solo che nn essendo minimamente esperto in SQL è la prima cosa che ho trovato che sembrava fare quello che volevo
Puoi postare i nomi dei campi delle 2 tabelle?
partite ha i campi
giornata
casa
fuori
mentre squadre ha i campi
id
nome
ovviamente i valori contenuti in casa e fuori di partite corrispondono all'id di squadre
partite ha i campi
giornata
casa
fuori
mentre squadre ha i campi
id
nome
ovviamente i valori contenuti in casa e fuori di partite corrispondono all'id di squadre
SELECT partite.giornata,
(SELECT squadre.nome FROM partite, squadre WHERE squadre.id = partite.casa),
(SELECT squadre.nome FROM partite, squadre WHERE squadre.id = partite.fuori)
FROM partite, squadre
WHERE partite.giornata = 1;
Il filtro WHERE lo puoi togliere se vuoi tutte le partite di tutte le giornate.
EDIT: puoi provare a togliere "squadre" dall'ultimo FROM, dovrebbe andare lo stesso.
EDIT 2: in alternativa puoi fare:
SELECT partite.giornata, squadre.nome,
(SELECT squadre.nome FROM partite, squadre WHERE squadre.id = partite.fuori)
FROM partite, squadre
WHERE (squadre.id = partite.casa) AND (partite.giornate = 1)
SELECT partite.giornata,
(SELECT squadre.nome FROM squadre WHERE squadre.id = partite.casa),
(SELECT squadre.nome FROM squadre WHERE squadre.id = partite.fuori)
FROM partite, squadre
WHERE partite.giornata = 1;
Il filtro WHERE lo puoi togliere se vuoi tutte le partite di tutte le giornate.
ottimo, grazie infinite...
per avere qualcosa di più gestibile con PHP ho aggiunto la ridefinizione dei nomi dei campi
SELECT partite.giornata, (
SELECT squadre.nome
FROM squadre
WHERE squadre.id = partite.casa
) AS casa, (
SELECT squadre.nome
FROM squadre
WHERE squadre.id = partite.fuori
) AS fuori
FROM partite, squadre
WHERE partite.giornata =1
@Wisher
Di nulla figurati :)
Sono un po' arrugginito con SQL, non ricordo bene i criteri di selezione tabelle nel FROM (se ne includi troppe, sprechi parecchia memoria e velocità computazionale, dal momento che il DMBS "tira su" in memoria tabelle inutili, che possono contenere decine di migliaia di tuple).
ottimo, grazie infinite...
per avere qualcosa di più gestibile con PHP ho aggiunto la ridefinizione dei nomi dei campi
SELECT partite.giornata, (
SELECT squadre.nome
FROM squadre
WHERE squadre.id = partite.casa
) AS casa, (
SELECT squadre.nome
FROM squadre
WHERE squadre.id = partite.fuori
) AS fuori
FROM partite, squadre
WHERE partite.giornata =1
purtroppo avevo cantato vittoria troppo presto, ogni riga è ripetuta più volte :( , adesso provo a vedere cosa succede con gli edti di fidel
Grazie della risposta, però nn mi è chiaro in che modo creare un'alias...
nell'esempio sopra, a e b sono gli alias, li crei postponendo qualcosa (nel caso di prima a e b, ma può essere qualsiasi cosa) al nome stesso della tabella (con uno spazio di solito)
quindi, usi gli alias invece che il vero nome della tabella per le tue query... anche se non so quale sia la sintassi precisa di tutti i "dialetti" SQL, questa in oracle, mysql, db2 sono sicuro che funge... ;)
purtroppo avevo cantato vittoria troppo presto, ogni riga è ripetuta più volte :( , adesso provo a vedere cosa succede con gli edti di fidel
Per forza, fai il prodotto cartesiano. Non credo che tu abbia bisogno di una join, ti bastano le sotto-select.
purtroppo avevo cantato vittoria troppo presto, ogni riga è ripetuta più volte :(
Hai provato con SELECT DISTINCT ?
Facci sapere.
Hai provato con SELECT DISTINCT ?
Facci sapere.
perfetto, adesso ci siamo, grazie a tutti.
un'ultima cosa, mi sapreste segnalare qualche link a tutorial/guide su SQL?
perfetto, adesso ci siamo, grazie a tutti.
un'ultima cosa, mi sapreste segnalare qualche link a tutorial/guide su SQL?
Mi spiace, per quanto mi riguarda SQL l'ho studiato all'università a suo tempo... Se vuoi posso passarti le dispense della prima parte del corso di Basi di Dati, che parla solo di SQL. Penso possano bastare per una buona conoscnza quantomento di SQL (le problematiche di un DBMS esulano dall'SQL in sè).
Mi spiace, per quanto mi riguarda SQL l'ho studiato all'università a suo tempo... Se vuoi posso passarti le dispense della prima parte del corso di Basi di Dati, che parla solo di SQL. Penso possano bastare per una buona conoscnza quantomento di SQL (le problematiche di un DBMS esulano dall'SQL in sè).
Allora aspetto l'anno prossimo, quando farò basi di dati...
per il momento nn ho questa grande necessità di impararmi SQL, ormai credo di aver capito le sotto-select e con quelle dovrei andara avanti senza problemi
SaintTDI
12-09-2006, 15:08
io per il mio fantacalcio e/o campionato l'ho gestita cosi:
select c.giornata, s_c.nome casa, s_f.nome trasferta
from calendario, squadre s_c, squadre s_f
where c.id_squadra_casa = s_c.id and
c.id_squadra_trasferta = s_f.id
dove c.giornata è il numero della giornata, puoi anche mettere una order by sulla giornata.
io per il mio fantacalcio e/o campionato l'ho gestita cosi:
select c.giornata, s_c.nome casa, s_f.nome trasferta
from calendario, squadre s_c, squadre s_f
where c.id_squadra_casa = s_c.id and
c.id_squadra_trasferta = s_f.id
dove c.giornata è il numero della giornata, puoi anche mettere una order by sulla giornata.
anche io sto facendo per il fantacalcio...
in questo modo tu hai definito due alias di squadre, giusto?
SaintTDI
12-09-2006, 16:46
anche io sto facendo per il fantacalcio...
in questo modo tu hai definito due alias di squadre, giusto?
immaginavo che era per il fantacalcio :D
si esatto due alias
squadre s_c, squadre s_f
:D
scusa... nel codice prima mi sono scordato l'alias "c" per la tabella calendario :D
immaginavo che era per il fantacalcio :D
ho anche vinto la prima giornata, con i risultati calcolati dal mio programmino :sofico:
SaintTDI
12-09-2006, 17:03
ho anche vinto la prima giornata, con i risultati calcolati dal mio programmino :sofico:
programmino fatto in ? php ?! non è che me lo passeresti se è in php :D
mi faresti un grandissimo favore :)
programmino fatto in ? php ?! non è che me lo passeresti se è in php :D
mi faresti un grandissimo favore :)
è ancora molto rudimentale, se però ti interessa mandami in PVT un tuo contatto e-mail o msn
SaintTDI
12-09-2006, 17:08
è ancora molto rudimentale, se però ti interessa mandami in PVT un tuo contatto e-mail o msn
ok... mando pm :D
magari ci possiamo aiutare a vicenda ;) io la parte DB ce l'ho tutta in testa e su excel :) pronta ad essere implementata (con relativa modifica delle formazioni ;) )
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.