Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 22
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    168

    left outer join e stesso record ripetuto n volte

    Ciao a tutti,
    mi sono imbattuta in un problema di questo tipo.
    Ho 2 tabelle su un DB access: "inserzioni" e "fotografie".
    A ciascuna inserzione possono ovviamente essere associate n. fotografie, per cui avremo:
    IDfoto | nomefile | IDinserzione
    ---------------------------
    1 | foto1.jpg | 12
    2 | pippo.jpg | 12
    3 | pluto.jpg | 14
    ecc ecc...

    Capita, probabilmente per un'errata scrittura dell'istruzione JOIN, che se un'inserzione ha, ad esempio, 2 fotografie, l'inserzione mi venga elencata 2 volte... quando io invece vorrei che l'inserzione venisse mostrata solo una volta... ecco il codicillo:

    codice:
    SELECT TOP 5 * FROM inserzioni LEFT OUTER JOIN fotografie ON inserzioni.IDinserzionetxt = fotografie.IDinserzione
    N.B. il campo "inserzioni.IDinserzionetxt" è un campo di testo (altrimenti non riuscivo a fare la join...), mentre "fotografie.IDinserzione" è un campo contatore, chiave primaria.

    Cosa c'è che non va? Mi date una manina per favore?
    Vi ringrazio in anticipo, ciao!
    t.

  2. #2
    usare la DISTINCT non aiuta?

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    168
    ho provato, magari in modo sbagliato, ad utilizzare DISTINCT (c'avevo pensato anch'io) ma non ottengo il risultato sperato, nel senso che continuo a visualizzare la stessa inserzione moltiplicata x il numero di fotografie ad essa associata...

    per completezza (per sintesi prima ho postato una query "semplificata"), aggiungo che la query in realtà contiene delle left outer join "annidate".

    la riporto per intero, nel caso che tali caratteristiche possano in qualche modo influenzare il funzionamento della query:

    codice:
    SELECT TOP 5 *, 
    inserzioni.comune AS ins_comune, 
    inserzioni.descriz AS ins_descriz, 
    inserzioni.provincia AS ins_provincia, 
    inserzioni.IDinserzione AS ins_IDinserzione, 
    inserzionisti_a.IDinserzionista_a AS ins_IDinserzionista_a, 
    inserzionisti_a.provincia AS ins_provincia 
    FROM ((inserzioni LEFT OUTER JOIN inserzionisti_a ON inserzioni.IDinserzione = inserzionisti_a.IDinserzionista_a_txt) LEFT OUTER JOIN inserzionisti_b ON inserzioni.IDinserzione = inserzionisti_b.IDinserzionista_b_txt) LEFT OUTER JOIN fotografie ON inserzioni.IDinserzione_txt = fotografie.IDinserzione ORDER BY datapubblicazione DESC
    N.B. ci sono un po' di alias poichè ho campi con lo stesso nome su più tabelle...

    mi sa che ho fatto proprio un bel pastrocchio di codice... optime, sei tu quello della birra offerta in caso di reply coronato da successo? se sì, ne ho qui una bella fresca fresca, hehehe

    t.

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    168
    (molto timidamente...)

    non c'è proprio proprio proprio nessuno che può darmi una manina...? :quote:


  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    168
    Ciao a tutti,
    a distanza di qualche giorno (e dopo svariate "prove tecniche" conclusesi con un nulla di fatto...), torno a farmi sentire su questo problema che mi sta letteralmente facendo perdere la testa...

    Distinct... group by... select annidate... le ho provate tutte ed in nessun modo riesco a tirar fuori solamente un'istanza di ciascun record in caso di più foto associate ad esso...

    Questa volta, per evitare di far perdere la testa anche a voi (ed anche per dimostrarvi in qualche modo che non è mia intenzione limitarmi solamente a "chiedere aiuto" ma anche e sopratutto per imparare), ho pensato di riportarvi una select molto semplificata, più che altro per permettermi di "capire meglio" la struttura ed il funzionamento (quando funzionerà ovviamente... )

    La SELECT di prova su cui sto attualmente lavorando è la seguente:

    codice:
    SELECT a.IDofferta, a.IDoffertatxt, a.comune AS offcomune, a.descriz AS offdescriz, a.provincia AS offprovincia, a.localita AS offlocalita, MAX(b.filename_p) AS Image, a.dataorapubblicazione FROM offerte a LEFT JOIN foto_immobili b ON b.IDofferta = a.IDoffertatxt  GROUP BY a.IDofferta, a.comune, a.descriz, a.provincia, a.localita, b.filename_p,  a.IDoffertatxt, a.dataorapubblicazione 
    ORDER BY a.dataorapubblicazione DESC
    Come vedete, questo è un test di impiego dell'istruzione GROUP BY, che in se funziona ma che continua a mostrarmi lo stesso record tante volte quante sono le immagini ad essa associate, per cui nessun passo avanti...

    Ho provato anche con DISTINCT ma niente da fare... per mia praticità non ho conservato tutte le prove che ho fatto, sarebbero state decine e decine di pagine, per cui non ho la possibilità di mostrarvi tutti i tentativi fatti (tra cui anche DISTINCT), spero che comunque potrete lo stesso aiutarmi a capire come scrivere correttamente questa benedetta query per elencare il record "offerta" solamente una volta, anche se ad esso sono associate 10 immagini...

    Vi ringrazio molto per l'aiuto che potrete darmi, resto in paziente attesa di vostri consigli e suggerimenti...

    Ciauz!

    t.

  6. #6

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    168
    Ho visto il thread, ho riadattato la soluzione al mio caso ma:

    - nel mio caso devo unire 2 tabelle diverse anzichè 1 (utilizzando left outer join anzichè inner join poichè posso anche avere dei record "offerta" senza foto)

    - se richiamo più di un campo nella prima select, devo poi richiamarlo anche nel group by, altrimenti ottengo errore "impossibile eseguire una query che non include l'espressione "idoffertatxt" specificata come parte di un'aggregazione"... ed io di campi della tabella "offerte" devo estrarne parecchi, ed alcuni dei quali anche ricorrendo agli alias... per non parlare di ulteriori 2 join con altrettante tabelle... ma per ora mi accontenterei di farne funzionare una...

    ho provato, come detto, ad applicare la soluzione proposta nell'altro thread in questo modo:

    codice:
    select T.* from
    (
     select idofferta, idoffertatxt, max(dataorapubblicazione) as MaxData from offerte
     group by idofferta, idoffertatxt
    ) as q1
    inner join foto_immobili as T
    on q1.idoffertatxt=t.idofferta
    Il risultato che ottengo è l'esatto opposto, ovvero visualizzo una "distinct" della sola tabella "foto_immobili" (con, allegati, i campi della tabella offerte), mentre io ho necessità di estrarre tutti i record "offerta" ma, ciascuno dei quali, estratto 1 volta sola, sia che ad esso siano associate zero foto (null) che diverse...

    Purtroppo il linguaggio sql non è il mio forte poichè mi occupo prevalentemente di grafica, motivo per cui se poteste farmi un esempio pratico, non dico "tagliato su misura" per il mio caso ma abbastanza fedele, per me sarebbe meglio... chiedo troppo?

    Se avete bisogno di ulteriori infos (es. struttura tabelle, che cmq ho già riportato fin dall'inizio) o altro, fatemi sapere che vi chiarisco qualunque aspetto...

    Vi ringrazio nuovamente per l'aiuto!

    t.

  8. #8
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    168
    ho provato in quest'altro modo:

    codice:
    SELECT T.* FROM (select idofferta, max(datains) AS MaxIdOfferta FROM foto_immobili GROUP BY idofferta) AS q1 RIGHT OUTER JOIN offerte AS T ON q1.idofferta=t.idoffertatxt
    purtroppo, però, non riesco ad includere nel recordset, e quindi a visualizzare a monitor, i campi della tabella "foto_immobili", in particolare "idofferta" e "filename_p".

    come includo tali campi nella query di cui sopra? credo davvero di essere vicina alla soluzione... mi aiutate per favore a mettere l'ultimo mattoncino?

    N.B. ho modificato, rispetto all'esempio di partenza, il tipo di JOIN, poiche "inner join" e "left outer join" mi estraevano solo le offerte che avevano delle foto.

    Vi ringrazio molto!

    t.

    P.S. se c'è qualcosa che non spiego bene o avete bisogno di altri dati, ditemelo per favore!

  9. #9
    fa' in modo di ottenere il solo ID (corretto, ovviamente) dalle tabelle. poi gli altri campi li ottieni con una subquery

    SELECT tutti_i_campi_che_vuoi FROM tabella WHERE id IN (qui metti la sub query) ORDER BY il_campo_che_vuoi

  10. #10
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    168
    allora, sono riuscita finalmente ad ottenere l'idofferta della tabella "foto_immobili", in questo modo:

    codice:
    SELECT T.*, foto_immobili.idofferta AS fotoidofferta FROM (select idofferta, max(datains) AS MaxIdOfferta  FROM foto_immobili GROUP BY idofferta) AS q1 RIGHT OUTER JOIN offerte AS T ON q1.idofferta=t.idoffertatxt
    quindi, secondo il tuo suggerimento, la "subquery" di cui parli è quella sopra indicata? proprio non si riesce, così come ho fatto per l'idofferta, ad estrarre questo benedetto "filename_p" nell'ambito della stessa query?

    il motivo della mia domanda è che volevo per quanto possibile cercare di "snellire" il codice sql il più possibile, anche perchè non è finita qui... il prossimo passo per me sarà aggiungere dati da altre 2 tabelle, quindi altre 2 join... :master:

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.