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

    vi chiedo un aiuto su una JOIN multipla veramente incasinata, grazie!

    Ciao a tutti,
    sinteticamente:

    5 tabelle così strutturate:
    (le coppie di asterischi servono a farvi capire le chiavi di collegamento tra le tabelle sulla base delle quali posso andare a costruire le mie JOIN)

    PRODOTTI
    IDprod * | nomeprod | IDcat | IDsubcat | IDsubsubcat ****
    1 | pippo | (vuoto) | (vuoto) | 1
    2 | pluto | (vuoto) | (vuoto) | 2
    3 | paperino | (vuoto) | (vuoto) | 3
    (ecc... con tanti altri record con differenti IDsubsubcat)

    CATEGORIE
    IDcat ** | nomecat
    1 | penne
    2 | matite
    (ecc...)

    SOTTOCATEGORIE
    IDsubcat *** | nomesubcat | IDcat **
    1 | a sfera | 1
    2 | stilografiche | 1
    (ecc...)

    SOTTOSOTTOCATEGORIE
    IDsubsubcat **** | nomesubsubcat | IDsubcat ***
    1 | inchiostroblu | 1
    2 | inchiostronero | 1
    3 | inchiostrorosso | 1
    (ecc...)

    FOTO
    IDfoto | nomefile | IDprod *
    1 | pippo1.jpg | 1
    2 | pippo2.jpg | 1
    3 | pluto.jpg | 2
    4 | paperino.jpg | 3
    (ecc...)

    Ebbene, mettiamo il caso di trovarci nella pagina della categoria "penne" (catalogo.asp?IDcat=1), come faccio a tirare fuori tutte le foto (solo il campo "nomefile" della tabella FOTO) dei prodotti che fanno parte della categoria "penne"?

    Voi direste... semplice: specifichi l'IDcat in corrispondenza di ciascun prodotto e risolvi con una banale join... e invece no!

    Infatti... per motivi troppo complicati da spiegare (legati alla creazione dinamica di un sistema di navigazione "ad albero" delle varie categorie, sottocategorie e, quindi, prodotti) non ho la possibilità di "collegare" le tabelle PRODOTTI e CATEGORIE andando a specificare l'IDcat per ciascun prodotto... bensì il livello di categoria più "basso" di cui il prodotto fa parte... lo so che è un modo cervellotico, ma è proprio strutturato così e non posso assolutamente cambiarlo.

    Per questo motivo, quindi, se rivedete la tabella PRODOTTI sopra riportata, troverete i campi "IDcat" e "IDsubcat" vuoti ed i soli campi "IDsubsubcat" (il livello di categoria più basso) pieni, in virtù di quanto sopra esposto.

    Pertanto il mio grosso problema è arrivare a tirar fuori la lista di tutte le foto della categoria "penne" (tabella CATEGORIE), INDIPENDENTEMENTE dalla sottocategoria e sottosottocategoria di appartenenza... avendo come unico dato, per ciascun prodotto, l'IDsubsubcat... quindi SQL deve andare a risalire attraverso i 2 livelli di categoria soprastanti (tabelle CATEGORIE e SOTTOCATEGORIE) i quali, ricordo, sono uniti dalle chiavi comuni di collegamento segnate dagli asterischi.

    Inoltre (importante ma non fondamentale) avrei bisogno che tale listato fosse, a sua volta, filtrato per far sì da avere solamente 1 fotografia per ciascun prodotto (GROUP BY?).

    Insomma, un gran casino... e non so veramente come fare xchè... questo non è propriamente il mio mestiere...

    Lo so, è spiegato da far schifo... ma spero che qualcosa si capisca...

    Vi ringrazio per l'aiuto (alias, graditissimo esempio di stringa SLQ con join) e ditemi pure se ci fosse qualcosa di poco chiaro (e mi sa che c'è....... ).

    Grazie davvero di cuore! t.

  2. #2
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    69
    Se ho capito correttamente quello che ti serve, prova a vedere se questa istruzione sql è quello che ti serve.

    codice:
    SELECT
    	FOTO.IDfoto, FOTO.nomefile, SOTTOSOTTOCATEGORIE.IDsubsubcat
    FROM
    	SOTTOSOTTOCATEGORIE INNER JOIN
            PRODOTTI INNER JOIN
            FOTO ON PRODOTTI.IDprod = FOTO.IDprod ON SOTTOSOTTOCATEGORIE.IDsubsubcat = PRODOTTI.IDsubsubcat
    WHERE
    	(SOTTOSOTTOCATEGORIE.IDsubsubcat IN 
                              (SELECT SOTTOSOTTOCATEGORIE_1.IDsubsubcat
                                FROM  CATEGORIE INNER JOIN
    			    SOTTOCATEGORIE ON CATEGORIE.IDcat = SOTTOCATEGORIE.IDcat INNER JOIN
                                SOTTOSOTTOCATEGORIE AS SOTTOSOTTOCATEGORIE_1 ON SOTTOCATEGORIE.IDsubcat = SOTTOSOTTOCATEGORIE_1.IDsubcat
                                WHERE (CATEGORIE.IDcat = 1)))
    Come filtro ho utilizzato il codice "WHERE (CATEGORIE.IDcat = 1)" ma puoi sostituirlo con il campo nomecat, filtrando per stringa non è molto performante su grosse moli di dati ma al limite puoi aggiungere un index.

    Fammi sapere se funziona o no, che al limite mi credo la struttura delle tue entità e provo.

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    168
    ahi, mi da "Errore di sintassi nella proposizione FROM"... eppure sembra scritto tutto benissimo... :master: (inizialmente mi dava errore perchè non gli piaceva l'istruzione "indentata" così ho dovuto mettere tutto su una riga... ma credo nessun problema... per lo meno spero... basta siano rispettati gli spazi, dico io...)

    non è che forse (mi chiedo io) manca qualche parentesi? mi ricordo (le pochissime che ho utilizzato con un minimo successo join multiple) che a volte le parentesi venivano messe subito dopo il FROM... ma non so, forse ricordo male...

    un'altra cosa che ho notato è che hai scritto un'INNER JOIN dopo l'altra (INNER JOIN prodotti INNER JOIN foto)... anche qui tutto ok? scusa se ti chiedo, non è certamente per mettere in discussione il tuo modo di scrivere le istruzioni (per me in questo momento ogni tuo aiuto è a dir poco divino!) ma non ho visto molte volte utilizzare questa modalità di scrittura... così mi è sorto questo piccolo dubbio...

    ti ringrazio di cuore per eventuali ulteriori aiuti che potrai darmi... ciao!

    t.

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    69
    Ho provato a creare un db con la tua struttura ed eseguendo la query mi risulta questo:

    codice:
    IDfoto nomefile    IDsubsubcat
    1	pippo1.jpg	1
    2	pippo2.jpg	1
    3	pluto.jpg 	2
    4	pape.jpg  	3
    sono tutte istruzioni standard, io avevo sotto mano un sql server 2005, non credo possa dipendere dal db, ma per sicurezza che database utilizzi ? L'applicazione è web o client ?

    Potrebbe esserci altre soluzioni al massimo.

    Ciao

  5. #5
    Utente di HTML.it L'avatar di wallrider
    Registrato dal
    Apr 2003
    Messaggi
    2,755
    la domanda è "quale FROM da errore?"

    prova a sostituire dei valori statici al posto della subquery, tipo così

    SELECT FOTO.IDfoto, FOTO.nomefile, SOTTOSOTTOCATEGORIE.IDsubsubcat FROM SOTTOSOTTOCATEGORIE INNER JOIN PRODOTTI INNER JOIN FOTO ON PRODOTTI.IDprod = FOTO.IDprod ON SOTTOSOTTOCATEGORIE.IDsubsubcat = PRODOTTI.IDsubsubcat WHERE (SOTTOSOTTOCATEGORIE.IDsubsubcat IN (1,2,3,5)
    se ti da errore è la FROM principale, altrimenti è l'altra
    RIP Cicciobenzina 9/11/2010

    "Riseminaciceli, i ceci nell'orto"

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    168
    niente da fare, stesso errore...

    cmq per la cronaca avevo provato anch'io a "staticizzare" l'istruzione in vari modi, ma ottengo sempre lo stesso errore...

    sigh...

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    69
    Nell'esempio di wallrider manca una parentesi di chiusura alla fine, riesci a postare le CREATE delle tabelle e specificare quale database stai utilizzando, altrimenti non saprei come aiutarti.

  8. #8
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    168
    Allora, il CREATE non so come si fa esattamente... come specificato in precedenza sono una grafica e capisco poco di queste cose, cioè, me la cavicchio ma quando le query si fanno così incasinate vado un po' in tilt...

    Cmq, il database è in formato MDB (Access 2000) e si tratta di un'applicativo web (IIS) su Win2003 server in perfetto stato di salute.

    Vi posto tutto il codicillo con connessione al DB e la stringa query da te suggerita (avevo scoperto parentesi mancante ed avevo corretto, ma non va lo stesso), magari può esservi d'aiuto.

    N.B. per praticità avevo tradotto i nomi delle tabelle in italiano, in realtà i campi sono "inglesizzati", vi posto questi ultimi (comunque vedrete che è chiarissimo)

    codice:
    <%
    StrConnessione = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ="_
     & server.MapPath("/mdb-database") & "\miodb.mdb" 
    
    Set Conn = Server.CreateObject("ADODB.Connection") 
    Conn.Open StrConnessione
    
    SQL = "SELECT foto.IDfoto, foto.filename_g, subsubcat.IDsubsubcat, foto.IDprod FROM subsubcat INNER JOIN prodotti INNER JOIN foto ON prodotti.IDprod = foto.IDprod ON subsubcat.IDsubsubcat = prodotti.IDsubsubcat WHERE (subsubcat.IDsubsubcat IN (SELECT subsubcat_1.IDsubsubcat FROM cat INNER JOIN subcat ON cat.IDcat = subcat.IDcat INNER JOIN subsubcat AS subsubcat_1 ON subcat.IDsubcat = subsubcat_1.IDsubcat WHERE (cat.IDcat LIKE " & Request.QueryString("IDcat") & ")))"
    
    'qui sopra ho messo LIKE anzichè = altrimenti, non so come mai, mi da errore...
    
    Set rs = Server.CreateObject("ADODB.RecordSet")
    rs.CursorLocation=3 
    rs.Open SQL, Conn, 1,1
    Spero tutto chiaro... ancora grazie di cuore, davvero, a tutti voi!
    t.

  9. #9
    Utente di HTML.it L'avatar di wallrider
    Registrato dal
    Apr 2003
    Messaggi
    2,755
    Originariamente inviato da tizianina
    ...
    Vi posto tutto il codicillo con connessione al DB e la stringa query da te suggerita (avevo scoperto parentesi mancante ed avevo corretto, ma non va lo stesso), magari può esservi d'aiuto.
    ...
    quindi probabilmente l'errore è nella prima query

    prova ad usare la creazione "visuale" delle query direttamente in access

    'qui sopra ho messo LIKE anzichè = altrimenti, non so come mai, mi da errore...
    i tipi dei vari IDprod e IDsubsubcat sono tutti corrispondenti e numerici?
    RIP Cicciobenzina 9/11/2010

    "Riseminaciceli, i ceci nell'orto"

  10. #10
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    69
    Dovevo immaginare fosse Access, purtroppo non lo considero come database quindi non ci avevo pensato. Creando un db con Access 2007 in compatibilità con la versione 2000 sono riuscito a ricreare lil tuo errore, ti avevo chiesto le create per vedere i tipi dei campi delle entità, ho dato per scontato che gli ID siano tutti numerici.

    codice:
    SELECT foto.nomefile
    FROM prodotti INNER JOIN foto ON prodotti.IDprod = foto.IDprod
    WHERE (((prodotti.IDsubsubcat) In (SELECT sottosottocategorie.IDsubsubcat FROM (sottosottocategorie INNER JOIN sottocategorie ON sottosottocategorie.IDsubcat = sottocategorie.IDsubcat) INNER JOIN categoria ON sottocategorie.IDcat = categoria.IDcat WHERE (((categoria.IDcat)=1)))));
    questo è il risultato che restituisce

    codice:
    nomefile
    pippo1.jpg
    pippo2.jpg
    pluto.jpg
    paperino.jpg
    Ti avevo chiesto che tipo di applicazione fosse perchè la struttura del db è errata, in una applicazione web si usa modellazione warehuose.

    Ultima cosa, non capisco perchè debba usare il LIKE, forse hai una stringa da qualche parte, comunque se cosi fosse usa pure il LIKE ma non mettere le % ai lati, ti restituirebbe più valori di quelli che vorresti.

    Un piccolo trucco in caso ti trovassi di fronte altre situazioni simili, se apri access puoi sfruttare la creazione di query per ottenere l'istruzione SQL che ti serve

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.