[Risolto]Problemi con LEFT JOIN

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
Bluto90
Prode Principiante
Messaggi: 76
Iscrizione: domenica 13 febbraio 2011, 12:26
Desktop: Gnome-shell
Distribuzione: Ubuntu 14.04 64bit
Località: Gottolengo (BS)
Contatti:

[Risolto]Problemi con LEFT JOIN

Messaggio da Bluto90 »

Ciao a tutti, ho bisogno di un aiuto.
Questa è la mia query:

Codice: Seleziona tutto

SELECT *
FROM table1 AS C LEFT JOIN table2 AS F ON C.id = F.id
WHERE C.id = "12345364365" AND (DATEDIFF( F.data, C.data ) <30) AND (DATEDIFF( F.data, C.data ) >0)
Il mio problema è che ho bisogno di tutte le righe della table1, anche quelle che non hanno un corispettivo nella table2 ma visto che nel where uso attributi della table2 non mi visualizza le righe "spaiate".

Come posso risolvere??

Grazie mille a chiunque mi aiutasse!
Ultima modifica di Bluto90 il sabato 9 febbraio 2013, 11:40, modificato 1 volta in totale.
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: Problemi con LEFT JOIN

Messaggio da Zoff »

Potresti spiegarti meglio? Vorresti anche le tuple in cui il campo F.data è NULL? Con quella condizione li elimini tu dalla query.

Prova con:

Codice: Seleziona tutto

SELECT *
FROM table1 AS C LEFT JOIN table2 AS F ON C.id = F.id
WHERE C.id = "12345364365" AND (F.data IS NULL OR ( (DATEDIFF( F.data, C.data ) <30) AND (DATEDIFF( F.data, C.data ) >0) ) )
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Avatar utente
Bluto90
Prode Principiante
Messaggi: 76
Iscrizione: domenica 13 febbraio 2011, 12:26
Desktop: Gnome-shell
Distribuzione: Ubuntu 14.04 64bit
Località: Gottolengo (BS)
Contatti:

Re: Problemi con LEFT JOIN

Messaggio da Bluto90 »

Niente da fare, così non va.

Provo a spiegarmi meglio:
alcune tuple della table1 hanno una tupla di riferimento nella table2, altre no.
Vorrei visualizzare tutte quelle della table1 con affiancato (per chi ce l'ha) la relativa della table2. Questa cosa normalmente si fa con un left join, ma nel mio caso non lo fa e mi visualizza solo quelle che hanno la relativa tupla di riferimento nella table2 (come un normale join)

:muro: :muro: :muro:
zeek
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1331
Iscrizione: domenica 19 ottobre 2008, 18:37
Località: Italia

Re: Problemi con LEFT JOIN

Messaggio da zeek »

e se provi così:

Codice: Seleziona tutto

SELECT *
FROM table1 AS C LEFT JOIN table2 AS F ON C.id = F.id
WHERE C.id = "12345364365" AND (F.id IS NULL OR ( (DATEDIFF( F.data, C.data ) <30) AND (DATEDIFF( F.data, C.data ) >0) ) )
Avatar utente
Bluto90
Prode Principiante
Messaggi: 76
Iscrizione: domenica 13 febbraio 2011, 12:26
Desktop: Gnome-shell
Distribuzione: Ubuntu 14.04 64bit
Località: Gottolengo (BS)
Contatti:

Re: Problemi con LEFT JOIN

Messaggio da Bluto90 »

Non cambia nulla, stesso identico risultato
zeek
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1331
Iscrizione: domenica 19 ottobre 2008, 18:37
Località: Italia

Re: Problemi con LEFT JOIN

Messaggio da zeek »

e allora con una query nidificata?
tipo

Codice: Seleziona tutto

SELECT * FROM (
SELECT ID FROM table2 as F WHERE (DATEDIFF( F.data, C.data ) <30) AND (DATEDIFF( F.data, C.data ) >0)
) AS T1 RIGHT JOIN TABLE1 ON T1.ID=T2.ID
WHERE T2.ID='123etcet'
Avatar utente
Bluto90
Prode Principiante
Messaggi: 76
Iscrizione: domenica 13 febbraio 2011, 12:26
Desktop: Gnome-shell
Distribuzione: Ubuntu 14.04 64bit
Località: Gottolengo (BS)
Contatti:

Re: Problemi con LEFT JOIN

Messaggio da Bluto90 »

Sulla query interna usi C.data ma non è stata mai definita una tabella C quindi non capisco come fare
Avatar utente
Bluto90
Prode Principiante
Messaggi: 76
Iscrizione: domenica 13 febbraio 2011, 12:26
Desktop: Gnome-shell
Distribuzione: Ubuntu 14.04 64bit
Località: Gottolengo (BS)
Contatti:

Re: Problemi con LEFT JOIN

Messaggio da Bluto90 »

Niente da fare, come immaginavo non sa dove andare a prendere C.data
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: Problemi con LEFT JOIN

Messaggio da Zoff »

Metti la clausola WHERE nella condizione di JOIN:

Codice: Seleziona tutto

SELECT *
FROM table1 AS C LEFT JOIN table2 AS F 
ON 
    C.id = F.id AND C.id = "12345364365" 
    AND (DATEDIFF( F.data, C.data ) <30) 
    AND (DATEDIFF( F.data, C.data ) >0)
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
gice2k
Prode Principiante
Messaggi: 10
Iscrizione: lunedì 1 gennaio 2007, 21:23

Re: Problemi con LEFT JOIN

Messaggio da gice2k »

Ciao, hai provato così?

Codice: Seleziona tutto

SELECT *
FROM table1 AS C LEFT JOIN table2 AS F ON C.id = F.id
WHERE (C.id = "12345364365" AND (DATEDIFF( F.data, C.data ) <30) AND (DATEDIFF( F.data, C.data ) >0)) or F.id is null
zeek
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1331
Iscrizione: domenica 19 ottobre 2008, 18:37
Località: Italia

Re: Problemi con LEFT JOIN

Messaggio da zeek »

Scusa ora ho capito: tu scegli un unico particolare id, è normale che se esiste nella tabella due, su ogni riga risultante avrai i dati della tabella due no? Non so se mi sono spiegato bene.. in pratica tu leghi le tabelle per codice e poi ne scegli uno: se il codice esiste nella tabella 2 allora in ogni riga del risultato avrai i dati della tabella due, altrimenti non li avrai in nessuna riga.. sbaglio?

Comunque mi eclisso che ho gia disturbato troppo xD
Ultima modifica di zeek il venerdì 8 febbraio 2013, 23:01, modificato 2 volte in totale.
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: Problemi con LEFT JOIN

Messaggio da Zoff »

Non servono union, basta spostare la condizione della where nell'ON del join
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
zeek
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1331
Iscrizione: domenica 19 ottobre 2008, 18:37
Località: Italia

Re: Problemi con LEFT JOIN

Messaggio da zeek »

Uhm siamo d'accordo però se tu filtri la prima tabella per un particolare id è normale che non ti faccia vedere gli altri no? O.o
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: Problemi con LEFT JOIN

Messaggio da Zoff »

Non ho capito cosa intendi
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
zeek
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1331
Iscrizione: domenica 19 ottobre 2008, 18:37
Località: Italia

Re: Problemi con LEFT JOIN

Messaggio da zeek »

Intendo:
Seleziona tutte le tuple della tabella uno che corrispondano oppure no alla tabella due, il risultato viene filtrato per l'id "x" della tabella uno.
A questo punto è normale che il risultato conterrà solo le tuple provenienti dalla tabella uno con id "x" e, se il legame esiste verranno agganciati i dati della tabella due (e subentrerà il filtro per range di date) sei dati non esistono nella tabella due l'insieme è vuoto perché il controllo sul range di date sarà sempre falso..
zeek
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1331
Iscrizione: domenica 19 ottobre 2008, 18:37
Località: Italia

Re: Problemi con LEFT JOIN

Messaggio da zeek »

Tra l'altro pirtroppo ho il brutto vizio di modificari i messaggi, ed ho cancellato la cosa sull'union quando tu avevi già risposto, scusa.

In effetti però ora che ci penso, mi sembra la soluzione giusta..
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: Problemi con LEFT JOIN

Messaggio da Zoff »

zeek » [url=http://forum.ubuntu-it.org/viewtopic.php?p=4316888#p4316888]ieri, 23:38[/url] ha scritto:Intendo:
Seleziona tutte le tuple della tabella uno che corrispondano oppure no alla tabella due, il risultato viene filtrato per l'id "x" della tabella uno.
A questo punto è normale che il risultato conterrà solo le tuple provenienti dalla tabella uno con id "x" e, se il legame esiste verranno agganciati i dati della tabella due (e subentrerà il filtro per range di date) sei dati non esistono nella tabella due l'insieme è vuoto perché il controllo sul range di date sarà sempre falso..
DIpende dove applichi il filtro. Se lo applichi alla WHERE sì, se lo applichi a ON o usi HAVING no.

Sostanzialmente secondo me la query piu' corretta e semanticamente esplicita è:

Codice: Seleziona tutto

SELECT * FROM  table1 AS C 
LEFT JOIN  table2 AS F
ON  C.id = F.id
HAVING  DATEDIFF( F.data, C.data ) <30  AND DATEDIFF( F.data, C.data ) >0
WHERE C.id = "12345364365"
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Avatar utente
Bluto90
Prode Principiante
Messaggi: 76
Iscrizione: domenica 13 febbraio 2011, 12:26
Desktop: Gnome-shell
Distribuzione: Ubuntu 14.04 64bit
Località: Gottolengo (BS)
Contatti:

Re: Problemi con LEFT JOIN

Messaggio da Bluto90 »

Con la prima soluzione proposta da Zoff (tutte le condizioni nel ON del JOIN) sembra restituire tutte le accoppiate delle tuple tab1 e tab2 collegabili ma senza mettere altri filtri.
Con la seconda (quella con l'having) mi da un errore sintattico prima della clausula WHERE

:cry: :cry: :muro: :muro: :muro:
zeek
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1331
Iscrizione: domenica 19 ottobre 2008, 18:37
Località: Italia

Re: Problemi con LEFT JOIN

Messaggio da zeek »

allora così:

Codice: Seleziona tutto

SELECT *
FROM table1 AS C LEFT JOIN table2 AS F ON C.id = F.id
WHERE
F.id IS NULL OR (C.id = "12345364365" AND (DATEDIFF( F.data, C.data ) <30) AND (DATEDIFF( F.data, C.data ) >0))
Avatar utente
Bluto90
Prode Principiante
Messaggi: 76
Iscrizione: domenica 13 febbraio 2011, 12:26
Desktop: Gnome-shell
Distribuzione: Ubuntu 14.04 64bit
Località: Gottolengo (BS)
Contatti:

Re: Problemi con LEFT JOIN

Messaggio da Bluto90 »

Risolto!!!!!


In questo modo funziona!!

Codice: Seleziona tutto

SELECT * 
FROM table1 AS C JOIN table2 AS F ON C.id = F.id 
WHERE C.id = "12345364365" 
HAVING  DATEDIFF( F.data, C.data ) <30  AND DATEDIFF( F.data, C.data ) >0 
:D :D :D

Grazie a tutti!!
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 3 ospiti