Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2005
    Messaggi
    27

    Join mysql... questa sconosciuta

    Purtroppo non ho mai fatto una join e adesso ne pago le conseguenze.

    Scherzi a parte, ho due tabelle

    TabA

    id
    campoa
    campob


    TabB

    id (corrisponde a id di TabA)
    campoc
    campod


    In Tab A ci sono 100 record, in Tab B solo 10, naturalmente con id corrispondenti in TAb A.


    Come faccio a fare una select che:

    mi cerca uno o piu' valori su qualunque dei 4 campi delle due tabelle e mi tira fuori i record anche se Tab B non ha record corrispondenti con tab A?

    Mi spiego meglio : se io nel campoa di Tab A ho su tre record il valore "Giorgio" e solo uno di questi tre record ha un record corrispondente in Tab B, come riesco a tirare fuori tre record cosi' formati :

    CampoA,CampoB,CampoC,CampoD
    CampoA,CampoB
    CampoA,CampoB

    Grazie a chi vorra' rispondere.

    Gigi

  2. #2
    left join....
    codice:
    SELECT *
    FROM tabA
    LEFT JOIN tabB USING (id)

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2005
    Messaggi
    27
    >SELECT *
    >FROM tabA
    >LEFT JOIN tabB USING (id)

    Quale id ? Quello della tabella A o tabella B ? Mi risponde ambigous !

    E poi dopo USING (id) posso mettere where con le condizioni ?

    Grazie

  4. #4
    Se ti risponde ambiguo allora dichiarali. Ma mi pare strano se i nomi sono identici e con lo stesso valore.
    codice:
    SELECT *
    FROM tabA
    LEFT JOIN tabB ON tabA.id = tabB.id
    WHERE ... quel che vuoi
    Con il LEFT JOIN ti rende "tutti" i record della tabella tabA e NULL nella tabB se mancasse la corrispondenza con tabA. Ovviamente dei record di tabA che rispondono anche alla condizione WHERE.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2005
    Messaggi
    27
    >SELECT *
    >FROM tabA
    >LEFT JOIN tabB ON tabA.id = tabB.id
    >WHERE ... quel che vuoi


    >Con il LEFT JOIN ti rende "tutti" i record della tabella tabA e >NULL nella tabB se mancasse la corrispondenza con tabA. Ovviamente >dei record di tabA che rispondono anche alla condizione WHERE.

    Purtroppo non e' vero, nel senso che, se io cerco un valore nel campoa di Taba, con questa join mi restituisce solo i record che hanno quella condizione MA CHE HANNO UNA CORRISPONDENZA nella Tab B.

    Io invece volevo che mi restituisse ANCHE i record che soddisfano la condizione del campoa in Taba ANCHE SE non hanno corrispondenza nella tabella B.

    Grazie per la pazienza.

    Gigi

  6. #6
    sarebbe bene tu postassi la query che usi. Con il LEFT JOIN la prima tabella (quella in FROM) presenta TUTTI i suoi record a prescindere dalla corrispondenza dell'id in tabb (quella in LEFT JOIN) condizionata solo dal filtro che metti in WHERE.

    Se nella tabB non trova corrispondenza con l'id di tabA, allora ti troverai con i campi messi a NULL nel result set.

    Quello che dici di ottenere (solo se entrambi presenti) tu lo ottieni se usi INNER JOIN dove i record estratti rispondono ad una equi-join definita nella condizione ON.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  7. #7
    Utente di HTML.it
    Registrato dal
    Aug 2005
    Messaggi
    27
    Ok, ecco la query

    $sqlcomm ="select idut,nomeut,emailut,ml,prov,regione,idw3k from w3kutenti left join w3ksermig on (idut=idw3k) where (((nomeut like '%$nomeut%') and (emailut like '%$emailut%') and (ml <> '')and
    (ml like '%$ml%') and (prov like '%$provincia%') and (regione like '%$regione%'))) order by nomeut";

    Ecco tabella A

    idut int(11)
    nomeut varchar(30)
    emailut varchar(50)
    ap char(1)
    riv char(1)
    ml int(20)

    Ecco tabella B

    id int(10)
    idw3k int(10) UNSIGNED
    emailx varchar(50)
    prov char(2)
    regione varchar(30)


    Nell'inserimento record, il programma quando carica un record nella tabella A, ne scrive anche uno nella tabella B mettendo

    idw3k=idut e
    emailx=emailut

    Nella tabella A preesistono pero' molti record che non hanno alcuna corrispondenza con record della tabella B.

    Grazie davvero.

    Gigi

  8. #8
    E' errata la query oppure mal composte le tabelle. Dovresti pero' mettere il codice tra tag code per maggior chiarezza per chi legge ... guarda bene:
    codice:
    $sqlcomm  = "select idut, nomeut, emailut, ml, prov, regione, idw3k 
                 from w3kutenti 
    	     left join w3ksermig on idut = idw3k 
    	     where nomeut like '%$nomeut%' 
    	     and emailut like '%$emailut%' 
    	     and ml <> ''
    	     and ml like '%$ml%' 
    	     and prov like '%$provincia%' 
    	     and regione like '%$regione%'
    	     order by nomeut";
    Per prima cosa e' inutile mettere le parentesi quando non servono e nel caso di AND non servono. Male non causano ma devono essere risolte in ogni caso. Ora puoi vedere una prima incongruenza:

    where ... prov e regione. Questi sono due campi della tabella tabb per cui se non sono presenti record in tabb il where assume tutto come FALSE e questo viene applicato anche alla taba.

    Poi metti due volte una condizione sul campo "ml" where ml diverso da vuoto AND ml like '%$ml%' ... qui devi verificare prima di comporre la query se "ml" e' richiesto oppure se e' vuoto e si tratta pure di un campo numerico quindi vuoto non lo sara' di certo al max sara' zero.

    Se invece vuoi trovare solo i record della tabella taba che non hanno corrispondenze con tabb prova la seguente...
    codice:
    $sqlcomm  = "select *
                 from w3kutenti 
    	     left join w3ksermig on idut = idw3k 
    	     where idw3k IS NULL";

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  9. #9
    Utente di HTML.it
    Registrato dal
    Aug 2005
    Messaggi
    27
    >$sqlcomm = "select idut, nomeut, emailut, ml, prov, regione, idw3k
    from w3kutenti
    left join w3ksermig on idut = idw3k
    where nomeut like '%$nomeut%'
    and emailut like '%$emailut%'
    and ml <> ''
    and ml like '%$ml%'
    and prov like '%$provincia%'
    and regione like '%$regione%'
    order by nomeut";

    >where ... prov e regione. Questi sono due campi della tabella tabb >per cui se non sono presenti record in tabb il where assume tutto >come FALSE e questo viene applicato anche alla taba.

    Ok, per il campo "ml" in effetti hai ragione, basta che cancello "ml <> ''" in quanto compresa nella AND successiva.

    Per quanto riguarda invece prov e regione, mettendo nella where la condizione "like '%campo%'" se il campo e' vuoto, la select restituisce TRUE in quanto lui accetta il controllo per vuoto cioe'
    '%%' . E' una tecnica che uso da sempre per fare appunto per fare una select sola a fronte ad es. di un form di ricerca.

    Perche' qui non funziona ? Se $provincia e' vuoto, lui dovrebbe restituire true perche' il controllo e' LIKE '%%'. Non e' cosi' ?

    Tutto questo cinema di due tabelle e' nato perche' non posso toccare la tab a per aggiungere i campi che ho messo nella tab b, in quanto intervengo su una procedura PHP/Mysql non mia aggiungendo appunto alcuni campi.
    La select in questione, senza la join e la presenza di tab b e dei suoi campi funziona da parecchio.

    Ti chiedo: non vedi soluzioni per poter utilizzare una sola select per fare una ricerca omnicomprensiva su tutti i campi delle due tabelle, che raccoglie i suoi dati da un form di ricerca precedente ?

    Che soluzioni ci sono secondo te ?

    Grazie

    Gianni

  10. #10
    Usa le quote [quote ] per le citazioni o non si capisce piu' nulla.
    Originariamente inviato da gil58
    Ok, per il campo "ml" in effetti hai ragione, basta che cancello "ml <> ''" in quanto compresa nella AND successiva.

    Per quanto riguarda invece prov e regione, mettendo nella where la condizione "like '%campo%'" se il campo e' vuoto, la select restituisce TRUE in quanto lui accetta il controllo per vuoto cioe'
    '%%' . E' una tecnica che uso da sempre per fare appunto per fare una select sola a fronte ad es. di un form di ricerca.

    Perche' qui non funziona ? Se $provincia e' vuoto, lui dovrebbe restituire true perche' il controllo e' LIKE '%%'. Non e' cosi' ?
    Non e' cosi'. il campo vuoto in corrispondenza del record joinato assume NULL come valore. NULL e' diverso da vuoto. In pratica viene formata una tabella temporanea pescando i record che soddisfano la condizione ON del JOIN dalle due tabelle, su questi record viene applicato il filtro WHERE, quindi quando il filtro agisce trova NULL. Potresti provare una cosa del genere:
    codice:
    $sqlcomm  = "select idut, nomeut, emailut, ml, prov, regione, idw3k 
                 from w3kutenti 
    	     left join w3ksermig on idut = idw3k 
    	     where nomeut like '%$nomeut%' 
    	     and emailut like '%$emailut%' 
    	     and ml like '%$ml%' 
    	     and (prov like '%$provincia%' 
                      OR prov IS NULL)
    	     and (regione like '%$regione%'
                      OR regione IS NULL)
    	     order by nomeut";
    occhio alle parentesi tonde.
    Tutto questo cinema di due tabelle e' nato perche' non posso toccare la tab a per aggiungere i campi che ho messo nella tab b, in quanto intervengo su una procedura PHP/Mysql non mia aggiungendo appunto alcuni campi.
    La select in questione, senza la join e la presenza di tab b e dei suoi campi funziona da parecchio.

    Ti chiedo: non vedi soluzioni per poter utilizzare una sola select per fare una ricerca omnicomprensiva su tutti i campi delle due tabelle, che raccoglie i suoi dati da un form di ricerca precedente ?

    Che soluzioni ci sono secondo te ?
    Intanto farei una copia di taba in tabb, completerei i campi mancanti e poi le ricerche le farei solo sulla mia tabella, anzi.... non vedo proprio perche' devi seguire due tabelle. Se lo script non lo puoi toccare come fai allora a fare questa gestione di record doppi?

    Mi sfugge la ragione.... la procedura php/mysql mi pare che devi rimaneggiarla comunque e rimaneggiarla anche profondamente per usare due tabelle. Sarebbe semplicissimo aggiungere le due colonne e lavorare solo su una tabella. Volendo potresti fare una tabella di prov/regioni ed associare il record in un campo aggiunto in taba.


    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.