Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2005
    Messaggi
    188

    JOIN, selezionare record che non hanno corrispondenza con altra tabella

    Ciaoa a tutti,

    io ho questa esigenza:

    ho due tabelle mysql così strutturate:

    tabella1:
    id
    nome
    campo1
    campo2

    teballa2:
    id
    nome
    id_tabella1
    campo2

    sono campi di esempio, è un caso che siano identiche :-)

    io ho la necessità di selezionare in tabella1 tutti i record che hanno un NOME X (il nome già lo so e viene trasmesso con una variabile in PHP, non ci sono problemi), ma dove NON TROVA nessun record corrispondente in tabella2. In pratica, il collegamento comune da tabella1 a tabella2 è il campo id_tabella1 presente nella tabella2, io ho la necessità di selezionare certi record in tabella1 dove però non hanno alcuna corrispondenza in tanella2

    Posso fare questa operazione con una JOIN? vorrei evitare di selezionare tutti i record con una certa caratteristica nella tabella1 e poi controllarmeli uno per uno con un ciclo while.

    Grazie in anticipo

  2. #2
    Prova una cosa del genere:

    Codice PHP:
    SELECT 
    t1
    .idt1.nomet1.campo1t1.campo2 
    FROM 
    tabella1 t1 
    JOIN tabella2 t2 
    ON t1
    .id <> t2.id_tabella1 
    WHERE 
    t1
    .nome '$nome'"; 
    P.S.
    Non l'ho provata.
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2005
    Messaggi
    188
    grazie di avermi risposto satifal

    con la tua query ho lo stesso problema che avevo quando ho fatto le mie prove prima di postare.

    Spiego bene il problema prendendo come esempio la query che mi hai postato in precedenza.

    WHERE t1.nome = '$nome'";

    mettiamo il caso che SOLO con questa condizione (quindi JOIN a parte) esistano 5 record che corrispondano al criterio. In poche parole con una query del tipo:

    SELECT * FROM tabella1 WHERE nome = '$nome'

    ho 5 risultati, benissimo... io però voglio trovare quali tra questi 5 risultati NON abbia un aggancio in tabella2, quindi dove in tabella2 nel campo id_tabella1 non esiste l'id corrispondente.

    Ora, con la JOIN che mi hai fornito tu prima (e anche con quelle provate da me in precedenza), ho fatto SELECT * (quindi mi fa vedere tutti i campi), il risultato che interessa a me è vedere il record della mia tabella1 (che è quyel che mi interessa) e NULL ai volori di tabella2 (poichè non c'è nessuna corrispondenza). Invece, guardando il risultato da phpmyadmin, nel record che viene formato, in tabella2 mi prende in considerazione valori di un altro record (che rispecchiano il WHERE dichiarato dopo, tanto per intenderci). Do cinseguenza ho un abbinamento sbagliato

    Soluzioni?

    grazie ancora per la collaborazione

  4. #4
    Utente di HTML.it L'avatar di Razorblade
    Registrato dal
    Feb 2002
    Messaggi
    1,308
    Credo che basti aggiungere alla query

    codice:
    AND t2.id_tabella1 IS NULL
    Ciao

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2005
    Messaggi
    188
    Originariamente inviato da Razorblade
    Credo che basti aggiungere alla query

    codice:
    AND t2.id_tabella1 IS NULL
    Ciao
    l'ho aggiunto alla fine del WHERE ma non va, non mi mostra risultati. Nel test che sto facendo ho 2 record validi in tabella1, uno però ha la corrispondenza in tabella2, mi deve mostrare però quello che non ha corrispondenza in tabella2. Così però dice che non ci sono risultati

  6. #6
    Prova così, anche se dovrebbe essere uguale a quella che ti ho già postato:

    Codice PHP:
    SELECT 
    t1
    .idt1.nomet1.campo1t1.campo2 
    FROM 
    tabella1 t1
    tabella2 t2  
    WHERE 
    t1
    .nome '$nome' AND t1.id <> t2.id_tabella1 
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  7. #7
    Originariamente inviato da agmama
    ...
    il risultato che interessa a me è vedere il record della mia tabella1 (che è quyel che mi interessa) e NULL ai volori di tabella2 (poichè non c'è nessuna corrispondenza). Invece, guardando il risultato da phpmyadmin, nel record che viene formato, in tabella2 mi prende in considerazione valori di un altro record (che rispecchiano il WHERE dichiarato dopo, tanto per intenderci)
    ...
    In effetti non ci ho capito molto dalla tua spiegazione. A me era sembrato di capire che tu volessi i record di tabella1 che hanno come nome quello da te passato ma il cui id non è presente nella colonna id_tabella1 della tabella2.
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2005
    Messaggi
    188
    Originariamente inviato da satifal
    In effetti non ci ho capito molto dalla tua spiegazione. A me era sembrato di capire che tu volessi i record di tabella1 che hanno come nome quello da te passato ma il cui id non è presente nella colonna id_tabella1 della tabella2.
    esatto... è così.

    faccio un esempio pratico per spiegarmi meglio, anche ul risultato che ottengo

    in tabella1, voglio tutti i record che hanno stato uguale a 2 e che hanno il nome "marco", ora... io so che alcuni (non tutti) dei record con stato uguale a 2, hanno una corrispondenza nella tabella2. Io voglio sapere quali di questi NON ce l'ha. Ora, la tabella2 ha delle parti in comune, anche questa ha il campo nome, e nei record in comune c'è lo stesso nome presente in tabella1 (ma questo serve a poco) e il campo id_tabella1 che contiene il riferimento vero e proprio alla tabella1, è quello che mi lega i record insomma...

    esempio pratico:
    voglio trovare quali record in tabella1 con il nome "marco" e che hanno lo stato uguale a 2, non hanno record corrispondendi in tabella2 (quindi non ci sono record in tabella2 dove nel campo id_tabella1 ci sia l'ID del record tabella1). Se per esempio i record con questi criteri (quindi SELECT * FROM tabella1 WHERE nome = 'marco' AND stato = '2') sono 3: ad esempio con ID 11, 25, 36 mettiamo il caso che 11 e 36 abbiano il record corrispondente (quindi ci sono 2 record in tabella2 dove id_tabella1 hanno 11 e 36) mi deve risultare che il record 25 non ha nessun record corrispondente in tabella2

    Sono stato più chiaro?

    A spiegarlo è un po' un gran rompicapo hehe

  9. #9
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Originariamente inviato da agmama
    A spiegarlo è un po' un gran rompicapo hehe
    Nessun rompicapo, è una banalissima outer join

    codice:
    SELECT t1.* FROM tabella1 t1 LEFT JOIN tabella2 t2 ON t1.id = t2.id_tabella1
    WHERE id_tabella1 IS NULL

  10. #10
    Utente di HTML.it
    Registrato dal
    Mar 2005
    Messaggi
    188
    Originariamente inviato da luca200
    Nessun rompicapo, è una banalissima outer join

    codice:
    SELECT t1.* FROM tabella1 t1 LEFT JOIN tabella2 t2 ON t1.id = t2.id_tabella1
    WHERE id_tabella1 IS NULL
    GRAZIEEEEEEEE funzionaaa

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 © 2025 vBulletin Solutions, Inc. All rights reserved.