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

    tabelle relazioni - molti a molti

    ecco la struttura (scusare sarà un post lunghissimo con sti disegni penosi)

    -----------
    autori
    -----------
    id_Autori
    ------------

    --------------
    libri_autori
    --------------
    id_Autori
    --------------
    id_Libro
    ---------------

    -----------
    libri
    -------------
    id_Libri
    ------------
    id_Casa
    -------------

    --------------
    casa_editrice
    --------------
    id_Casa
    --------------


    dovrei estrarre i dati dell'autore
    i libri da lui realizzati
    le case editrici con cui ha lavorato

    ecco la query...
    1) è mostruosamente enorme,
    2) nn funziona, mi restituisce i risultati della casa editrice e del libro triplicati


    SELECT autori.nome, autori.contatti, autori.descrizione, autori.dir,
    GROUP_CONCAT( libri.id_Libro ORDER BY libri.uscita DESC ) AS id_Libro,
    GROUP_CONCAT( libri.titolo ORDER BY libri.uscita DESC ) AS titolo,
    GROUP_CONCAT( case_editrici.nome ORDER BY case_editrici.id_Casa ) AS id_Casa,
    GROUP_CONCAT( case_editrici.id_Casa ORDER BY case_editrici.id_Casa ) AS casa
    FROM autori
    LEFT JOIN libri_autori ON autori.id_Autore = libri_autori.id_Autore

    LEFT JOIN libri ON libri_autori.id_Libro
    IN (
    SELECT DISTINCT libri_autori.id_Libro
    FROM libri_autori
    where libri_autori.id_Autore = autori.id_Autore
    )

    LEFT JOIN case_editrici ON libri.id_Casa
    IN (
    SELECT DISTINCT libri.id_Casa
    FROM libri
    WHERE libri.id_Libro
    IN (
    SELECT DISTINCT libri_autori.id_Libro
    FROM libri_autori
    where libri_autori.id_Autore = autori.id_Autore
    )
    )

    WHERE autori.id_Autore = '".$id."'
    GROUP BY autori.id_Autore

  2. #2
    se conosci le regole di normalizzazione di un database, la relazione molti a molti è la più complessa da elaborare. La cosa migliore è introdurre una tabella intermedia che contiene ad esempio tutte le chiavi coinvolte, per cui ti consiglio di rivedere la struttura del db!!!

  3. #3
    ho già fatto lo schema tenendo conto che per le tabelle molti a molti (solo libri e autoir) ci debba essere un'altra tabella tabella (libri_autori) in cui tenere le Key di queste 2 tabelle.

    Il problema è che le subquery le ho viste solo ieri e ho qualche difficoltà, e poi è immensa, mi chiedo se non si si possa anche snellirla



    cmq riguardandola ... nn è che sia errata, le relazioni sono state seguite

    il problema della ripetizione è data dal fatto che nella tabella intermedia diciamo la KEy è composta dall'unione delle 2 chiave esterne, che singolarmente si possono anche ripetere nei valori ma in coppia sono appunto uniche... quindi nella subquery quanto estraggo l'id_Libro mi estrae tutti i record con quella chiave nn quelli abbinati all'altro campo


    come si fa??????????????????

  4. #4
    mi sembra tutta una complicazione.... scegli un id autore e si presume sia uno solo ma fai un group by....

    codice:
    SELECT au.nome, au.contatti, au.descrizione, au.dir, 
    GROUP_CONCAT( li.id_Libro ORDER BY li.uscita DESC ) AS id_Libro, 
    GROUP_CONCAT( li.titolo ORDER BY li.uscita DESC ) AS titolo, 
    GROUP_CONCAT( ce.nome ORDER BY ce.id_Casa ) AS id_Casa, 
    GROUP_CONCAT( ce.id_Casa ORDER BY ce.id_Casa ) AS casa
    
    FROM autori au
    LEFT JOIN libri_autori la ON au.id_Autore = la.id_Autore
    LEFT JOIN libri li ON la.id_Libro = li.id_Libro
    LEFT JOIN case_editrici ce ON li.id_Casa = ce.id_casa
    WHERE autori.id_Autore = '".$id."'
    perche' deve esserci una relazione molti a molti tra autori e libri? Se c'e' e' errato come inserisci i dati. L'autore e' uno e puo' avere molti libri.... dove vedi la relazione molti - molti....

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

  5. #5
    ok l'ho snellita ...
    SELECT autori.nome, autori.contatti, autori.descrizione, autori.dir, GROUP_CONCAT( libri.id_Libro
    ORDER BY libri.uscita DESC ) AS id_Libro, GROUP_CONCAT( libri.titolo
    ORDER BY libri.uscita DESC ) AS titolo, GROUP_CONCAT( case_editrici.nome
    ORDER BY case_editrici.id_Casa ) AS id_Casa, GROUP_CONCAT( case_editrici.id_Casa
    ORDER BY case_editrici.id_Casa ) AS casa
    FROM autori
    LEFT JOIN libri_autori ON autori.id_Autore = libri_autori.id_Autore
    LEFT JOIN libri ON libri_autori.id_Libro = libri.id_Libro
    LEFT JOIN case_editrici ON libri.id_Casa
    IN (

    SELECT DISTINCT libri.id_Casa
    FROM libri
    WHERE libri.id_Libro = libri_autori.id_Libro
    AND libri_autori.id_Autore = autori.id_Autore
    )
    WHERE autori.id_Autore =4
    GROUP BY autori.id_Autore
    il problema sta nella casa editrice che mi estrae sempre il valore + volte

  6. #6
    ahh ho visto ora
    per autore intendo
    scrittore, sceneggiattore e disegnatore
    quindi un libro può avere diversi autori, che nn posso classificare in un ruolo perchèa volte sono tutte e 3 riuniti, o solo 2 figure


    e il gruppo lo faccio per ... mi pare per il group_contatct .... insomam c'era un elemento che richideva obbligatoriamene sto group by



    sto impazzendo ...
    la relazione

    autori -> libri_autori -> libri è ok ma
    autori -> libri_autori -> libri -> case editrici è un dramma
    nn riesco ad estrarre i dati dall'ultima




  7. #7
    vi prego mi potreste spiegare?

    nn riesco a capire come collegarmi alle tabelle

    PieroMac ci sei???

  8. #8
    Diciamo in parole molto povere che nel tuo caso la tabella "LIBRI" e' la tabella che contiene l'entita' principale, quella che rappresenta poi lo scopo del database.

    quindi questa tabella va esplorata "tutta" e deve essere messa nell'istruzione FROM

    SELECT * FROM libri AS li

    Ora devi trovare la casa editrice che e' vincolata alla tabella libri dal campo id_Casa. qui siamo di fronte ad una relazione molti libri ad una casa

    LEFT JOIN casa_editrice AS ce ON li.id_Casa = ce.id_Casa

    ora dobbiamo trovare i record associati al libro nella tabella libri_autori. Anche qui il rapporto potra' essere molti a uno.... molte associazioni autori/sceneggiatori/disegnatori per un libro ... ci vorranno solo i record che rispondono all'id_Libro

    LEFT JOIN libri_autori AS la ON li.id_Libro = la.id_Libro

    e a seguire ...

    LEFT JOIN autori AS au ON la.id_Autore = au.id_Autore

    poi nel where poni gli altri vincoli. Non capisco pero' come identifichi autori/sceneggiatori/disegnatori di certo non dovrebbero convivere riuniti nella stessa tupla o peggio nello stesso campo.

    Ogni "personaggio" dovrebbe avere il suo record, nella associazione libri_autori tanti record per ogni "personaggio" legato al libro.

    Occhio che sono indicazioni di massima. Non amministro il tuo db e non ho idea del tuo progetto e quindi le mie sono solo parole..... per esempio ho un'applicativo per una biblioteca e considero tutti gli attributi di un libro come parte integrante del libro stesso cioe' una sola "entita'" alla stregua di una agenda dove "pochi" si sognerebbero di dividere il nominativo dall'indirizzo o dal cap, prov.... Quindi un libro con il suo ISBN ha il suo "patrimonio genetico".

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

  9. #9
    grazie Piero,
    mhhh avevo letto che nel caso di relazioni molti a molti, per estrarre i dati, erano neccessarie + query, quindi stavo a scervellarmi con le subquery che devo dire che nn mi sono di nessuna utilità!!!almeno in queste estrazioni
    Per il libro si va bene così


    SELECT li.id_Libro,li.titolo,ce.nome,li.dir,
    GROUP_CONCAT( au.nome ORDER BY au.nome ASC ) AS autore,
    GROUP_CONCAT( au.id_Autore ORDER BY au.nome ASC ) AS id_autore
    FROM libri AS li
    LEFT JOIN collane AS co ON co.id_Collana = li.id_Collana
    LEFT JOIN case_editrici AS ce ON ce.id_Casa = co.id_Casa
    LEFT JOIN libri_autori AS la ON li.id_Libro = la.id_Libro
    LEFT JOIN autori AS au ON la.id_Autore = au.id_Autore
    WHERE li.id_Libro = ".$id."
    GROUP BY li.id_Libro
    ma per la scheda degli autori (in cui raggruppo per autore) ho il problema della moltiplicazione delle voci nelle relazioni uno a molti (quindi mi vedo + volte la casa editrice se l'autore ha scritto più libri)


    SELECT au.nome, au.contatti, au.descrizione, au.dir,
    GROUP_CONCAT( li.id_Libro ORDER BY li.uscita DESC ) AS id_Libro,
    GROUP_CONCAT( li.titolo ORDER BY li.uscita DESC ) AS titolo,
    GROUP_CONCAT( ce.nome ORDER BY ce.id_Casa ) AS id_Casa,
    GROUP_CONCAT( ce.id_Casa ORDER BY ce.id_Casa ) AS casa
    FROM autori au
    LEFT JOIN libri_autori la ON au.id_Autore = la.id_Autore
    LEFT JOIN libri li ON la.id_Libro = li.id_Libro
    LEFT JOIN case_editrici ce ON li.id_Casa = ce.id_Casa
    WHERE au.id_Autore ='".$id."'
    GROUP BY au.id_Autore
    è possibile fare 2 group by?
    del tipo quanto estraggo dalla tabella autori raggruppo per l'id dell'autore
    quando estraggo dalla tabella case editrici raggruppo per id_Casa e così non ho doppioni

  10. #10
    GROUP_CONCAT(DISTINCT ce.nome ORDER BY ce.id_Casa ) AS id_Casa,



    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.