Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1

    [MYSQL] problema left join

    ciao a tutti,
    vi spiego il problema:

    ho tre tabelle

    PUBBLICAZIONE
    id_pubblicazione
    titolo

    la principale (contiene l'elenco delle pubblicazioni)

    SCHEDA
    id_scheda
    scheda

    che contiene l'elenco delle schede presenti nella pubblicazione

    PUBBLICAZIONE_U_SCHEDA
    id_pubblicazione
    id_scheda


    per l'unione uno a molti tra la tabella PUBBLICAZIONE e la tabella SCHEDA


    vorrei fare una query che, passato un determinato id_pubblicazione, mi tira fuori TUTTE le schede (id_scheda, scheda), anche se non sono presenti in quella pubblicazione, e l'id_pubblicazione (che prende il valore NULL, se la pubblicazione non ha una scheda, altrimenti id_pubblicazione, se ha la scheda).
    ___________________________________
    esempio:
    PUBBLICAZIONE
    1|Idrogeologia
    2|Falde Acquifere

    SCHEDA
    1|La Porosità
    2|Il Carico Idraulico

    PUBBLICAZIONE_U_SCHEDA
    1|1
    2|1
    2|2

    la pubblicazione 1 ha solo la scheda della porosità.
    vorrei che, passando id_pubblicazione=1, il risultato della query fosse:

    id_scheda| scheda | id_pubblicazione
    1|La Porosità|1
    2|Il Carico Idraulico|NULL
    ___________________________________

    ho provato a fare nel seguente modo:

    SELECT scheda.id_scheda, scheda.scheda, pubblicazione_u_scheda.id_pubblicazione FROM scheda LEFT OUTER JOIN pubblicazione_u_scheda ON scheda.id_scheda = pubblicazione_u_scheda.id_scheda WHERE pubblicazione_u_scheda.id_pubblicazione=1


    ma il risultato è:
    id_scheda| scheda | id_pubblicazione
    1|La Porosità|1

    praticamente non mi fa vedere le schede che non sono presenti nella mia pubblicazione anche se ho usato LEFT OUTER JOIN (che in teoria dovrebbe comunque darmi tutte le schede)

    qualcuno mi sa aiutare

    grazie mille

    lilli

  2. #2
    spero di esser stata chiara...
    se mi sono spiegata male chiedete ma vi prego... aiutatemi!

  3. #3
    Utente di HTML.it L'avatar di telegio
    Registrato dal
    Sep 2001
    Messaggi
    2,591
    ..non si capisce infatti..

  4. #4
    Originariamente inviato da Lilli_Vex
    spero di esser stata chiara...
    se mi sono spiegata male chiedete ma vi prego... aiutatemi!
    Non e' chiarissima la cosa....

    la tabella di unione esiste solo se ci sono entrambi gli id associati. quindi cercare un id_pubblicazione = 1 equivale a cercare solo i record presenti in unione con entrambi gli id e dove id_pubblicazione = 1.

    Tu vuoi "tutti" i record di "scheda" e qui il "tutti" preclude qualsiasi id_pubblicazione. Gia' siamo in condizione conflittuale con la prima affermazione.

    In pratica ti servono due query: una ti trova i record scheda associati e l'altra i record scheda non associati...

    codice:
    select *
    from scheda s
    left join PUBBLICAZIONE_U_SCHEDA u
    ON s.id_scheda = u.id_scheda
    where u.id_pubblicazione = 1
    UNION
    select *
    from scheda s
    left join PUBBLICAZIONE_U_SCHEDA u
    ON s.id_scheda = u.id_scheda
    where u.id_pubblicazione IS NULL

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

  5. #5
    In pratica ti servono due query: una ti trova i record scheda associati e l'altra i record scheda non associati...
    non va
    il fatto è che, nel nostro caso, la prima select mi trova "porosità"
    mentre la seconda non mi restituisce nulla.

    il risultato quindi è sempre:
    id_scheda| scheda | id_pubblicazione
    1|La Porosità|1

  6. #6
    Originariamente inviato da Lilli_Vex
    non va
    il fatto è che, nel nostro caso, la prima select mi trova "porosità"
    mentre la seconda non mi restituisce nulla.

    il risultato quindi è sempre:
    id_scheda| scheda | id_pubblicazione
    1|La Porosità|1
    Lo supponevo perche' l'id_scheda e' associato a qualcun altro e quindi non e' NULL.

    Se id_scheda e' presente nella tabella di UNIONE e' perche' e' associato a qualche pubblicazione.

    Prova a mettere una condizione (if) :

    codice:
    SELECT s.id_scheda, 
         s.scheda, 
         if(u.id_pubblicazione = 1, u.id_pubblicazione, NULL) as id_pubblicazione
    from scheda s
    left join PUBBLICAZIONE_U_SCHEDA u ON s.id_scheda = u.id_scheda
    senza where ovviamente.

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

  7. #7
    ci siamo quasi...
    solo che ora il problema è che mi ritorna anche le schede collegate alla pubblicazione 2

    id_scheda| scheda | id_pubblicazione

    1|La Porosità|1 (questa è relativa alla id_pubblicazione 1)
    1|La Porosità|NULL (questa è relativa alla id_pubblicazione 2)
    2|Il Carico Idraulico|NULL (questa è relativa alla id_pubblicazione 2)

  8. #8
    torniamo all'inizio.... che cosa stai cercando?

    Se cerchi delle schede senza associazione e' una cosa, se cerchi schede NON associate al tuo id e' un'altra ma dovrai tener presente che queste schede sono/possono essere associate a qualcun altro. Mi pare sia inevitabile.

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

  9. #9
    cerco tutte le schede (con una occorenza per scheda) con in più l'id associato che gli passo che come avevi fatto nell'esempio precedente:

    if(u.id_pubblicazione = 1, u.id_pubblicazione, NULL) as id_pubblicazione

    quindi il risulato dovrebbe essere:

    1|La Porosità|1 (questa lo visualizza perchè è associato alla mia pubb. quindi nessun problema)
    1|Il Carico Idraulico|NULL (di questo invece visualizza solo la scheda, perchè non è associato alla mia pubblicazione, e quindi il valore id_pubblicazione a NULL)

    mi sa che non è possibile, vero?!

  10. #10
    dovrebbe essere come l'ultima query che hai postato ma con un distinct, che riguarda solo le schede, a cui si aggiunge, tramite un if, l'id_pubblicazione passato, se la scheda è associata, altrimenti NULL.
    VVoVe:

    che casino

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.