Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17

Discussione: Query su due tabelle

  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2007
    Messaggi
    18

    Query su due tabelle

    Buongiorno a tutti

    Dunque, io dovrei fare una query su due tabelle:
    - tabella artisti , che contiene dati anagrafici di vario tipo (cognome, nome, data_nascita, ecc)
    - tabella opere , che contiene immagini, oltre al nome e cognome dell'artista che ha realizzato l'opera (titolo_opera,cognome_autore, nome_autore, img_data, ecc)

    Vorrei fare in modo che visualizzando la scheda di un artista, insieme ai dati anagrafici contenuti nella tabella artisti si visualizzassero anche i titoli delle opere relative a quell'artista contenute nella tabella opere.

    Al momento sono riuscito a far funzionare la cosa utilizzando due query, ottenendo prima i dati dell'artista con questa query (l'id viene passato tramite GET):

    Codice PHP:
    $query "SELECT * FROM artisti WHERE id ='$id'";
    $result mysql_query($query);
    $row mysql_fetch_array($result); 
    e poi ottengo i titoli delle opere con quest'altra query,usando il nome e il cognome dell'autore ottenuto dalla query precedente:

    Codice PHP:
    $query2 "SELECT titolo_opera FROM opere WHERE cognome_autore ='$row[cognome]' AND nome_autore='$row[nome]'"
    mi chiedevo se c'è un metodo più semplice, magari utilizzando una sola query...

    grazie!

  2. #2
    Ti conviene strutturare le tue due tabelle in modo diverso..

    esempio:

    Tabella artisti
    aid - nome - cognome - altri dati

    Tabella opere
    oid - aid - titolo - img - data - ect ect


    In questo modo, come puoi vedere hai il campo "aid" comune sulle due tabelle e puoi scrivere una sola query tipo:

    Codice PHP:
    $query "SELECT * FROM artisti AS a LEFT JOIN opere AS o ON a.aid = o.aid WHERE a.aid = '$id_artista'"
    Questa volta, più che un voto.. è favoreggiamento.

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2007
    Messaggi
    18
    grazie per la risposta

    in effetti la tua soluzione è più pratica, però mi è venuto in mente che, oltre alle tabelle "artisti" e "opere", dovrò eseguire la stessa query almeno su altre due tabelle, cioè la tabella "mostre" e la tabella "testi".

    in pratica, vorrei visualizzare per ogni artista presente nella tabella "artisti" i dati relativi all'artista presenti nelle tabelle "opere", "mostre", e "testi"... in pratica una query a 4 tabelle!

    mi chiedo se anche con 4 tabelle è possibile ottenere i dati che mi interessano con una sola query, o se magari è preferibile fare 4 query distinte...

    Grazie

  4. #4
    allora... ragioniamo

    artisti

    idArtista nome cognome ecc...

    opere

    idOpera idArtista nome ecc...

    mostre

    idMostra idArtista....

    testi

    idTesto idArtista....

    la superquery è

    SELECT quello che vuoi FROM (((artisti LEFT JOIN opere USING(idArtista)) LEFT JOIN mostre USING(idArtista)) LEFT JOIN mostre USING(idArtista)) LEFT JOIN testi USING(idArtista) WHERE idArtista='$idArtista'

    però attento... cosi presupponi che le mostre siano tutte personali e non collettive, perchè associ ad ogni mostra UN SOLO artista...

    per avere anche le collettive dovresti avere una tabella mostre e una tabella mostre_artisti

    mostre

    idMostra nome data_da data_a ...

    mostre_artisti

    idMostra idArtista

    e per esempio per sapere la mostra del artista devi fare 'sta query

    select nome from mostre left join mostre_artisti using(idArtista) where idArtista='$idArtista'


    nota che io ho l'abitudine di avere colonne di tabelle che si riferiscono alla stessa cosa con lo stesso modo... in questo modo evito di fare LEFT JOIN... ON ma uso la clausola USING(colonna), piu pratica

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2007
    Messaggi
    18
    prima di tutto grazie per la risposta

    ok, per la superquery credo di aver capito

    per quel che riguarda le mostre,per la maggior parte si tratta di mostre collettive, quindi avevo pensato di creare un campo "artisti_partecipanti" nella tabella "mostre", nel quale inserire un array che contiene appunto nomi e cognomi degli artisti che hanno partecipato ad una determinata mostra, per far sì che usando come chiave nella query il nome e il cognome dell'artista (o comunque una qualche chiave identificativa dell'artista) si possa ottenere una lista di tutte le mostre alle quali ha partecipato.

    è possibile fare una cosa del genere? ci sono metodi alternativi, più semplici e più efficaci?

    vi ringrazio ancora, non sono molto ferrato sul php, ma devo imparare in fretta perchè sto realizzando questo sito dinamico come progetto di tesi

  6. #6
    non so si si possa salvare un array in mysql... puoi fare una cosa simile però! crei un campo artisti_partecipanti come varchar e quando crei una mostra fai in modo che in questa colonna vadano a finire tutti gli idArtista della collettiva separati da virgola.

    es 1,3,5,2,9

    quando poi vai a leggere il campo dopo una SELECT, invece di prendere il valore cosi com'è fai una cosa di questo tipo

    $result=mysql_query("SELECT artisti_partecipanti FROM mostre");
    $row=mysql_fetch_array($result);
    $idArtisti=explode(",",$row);

    in questo modo hai un'array con tutti gli idArtista partecipanti alla mostra.

  7. #7
    Posso suggerire visti gli sviluppi:


    artisti
    aid nome cognome ecc...

    opere
    oid aid nome ecc...

    testi
    tid aid....


    mostre
    mid nomeMostra....


    Visto che più artisti possono prendere parte ad una mostra, farei una semplice tabellina di collegamento:

    artisti a mostre
    mid aid

    In questo modo puoi associare più artisti ad una singola mostra.. e successivamente avrai lo storico delle mostre frequentate dai singoli artisti..

    Per la query devi avere pazienza o un'anima pia che ti risponde xke ora sono impegnato..
    Questa volta, più che un voto.. è favoreggiamento.

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2007
    Messaggi
    18
    già, in effetti mi sono sbagliato, non si possono usare array in tabelle SQL... forse la soluzione più semplice e più "ordinata" è proprio quella di creare la tabellina di collegamento tra mostre e artisti...

    concettualmente ho capito come funziona, praticamente però ho qualche perplessità...

    in pratica vorrei creare un'unica pagina con un form che mi permetta di inserire i dati relativi alla mostra e contemporaneamente gli artisti realtivi alla mostra... ma non ho mai lavorato su due tabelle contemporaneamente.

    avete qualche dritta/suggerimento?
    grazie!

  9. #9
    Ciao,

    penso che nel tuo caso è meglio se fai più form, uno per inserire l'artista, un per inserire il testo e uno per inserire le opere.. Questi form saranno collegati tra di loro da un campo artista dove selezioni l'artista di riferimento.. quindi spiego meglio:

    1: inserisci l'artista..
    2: inserisci una opera, questo form avrà un campo select con tutti gli artisti ed in base all'opera che stai inserendo selezioni l'artista di riferimento riempendo con l'id_artista il campo aid nella tabella opere..
    3: stessa del punto 2 cosa per i testi..


    Le mostre sono a se..
    Un'altro form ti permette di inserire le moste che stai realizzando.. solo le mostre..

    Un'altro form ti permette di associare gli artisti ad una mostra.. ad esempio puoi avere un form con il titolo della mostra e sotto la lista degli artisti, con una checkbox selezioni gli artisti che sono adati alla mostra in oggetto.. o viceversa..

    La cosa forse complicata è la query di selezione:
    Codice PHP:
    $query "SELECT * FROM tabella_collegamento AS t LEFT JOIN artisti AS a ON t.aid = a.aid WHERE t.mid = '$id_mostra'"
    Questa è abbastanza semplice, se vuoi recuperare anche i dati relativi ai testi e alle opere devi fare delle JOIN anche su quelle tabelle sempre con l'id_artista..
    Se hai bisogno di ulteriori spiegazioni chiedi pure..
    Questa volta, più che un voto.. è favoreggiamento.

  10. #10
    Originariamente inviato da Linus80
    non so si si possa salvare un array in mysql... puoi fare una cosa simile però! crei un campo artisti_partecipanti come varchar e quando crei una mostra fai in modo che in questa colonna vadano a finire tutti gli idArtista della collettiva separati da virgola.

    es 1,3,5,2,9

    quando poi vai a leggere il campo dopo una SELECT, invece di prendere il valore cosi com'è fai una cosa di questo tipo

    $result=mysql_query("SELECT artisti_partecipanti FROM mostre");
    $row=mysql_fetch_array($result);
    $idArtisti=explode(",",$row);

    in questo modo hai un'array con tutti gli idArtista partecipanti alla mostra.
    Ti sconsiglio vivamente di seguire questa via, ti complicherà enormemente le cose in futuro quando dovrai continuamente fare un parse del campo e una tabella mysql è molto più semplice da gestire di una variabile che contiene valori multipli.
    Di base un campo di un database deve MAI contenere valori multipli !!
    Il mio futuro ?? Io lo conosco, è il PARTY !! (Party Man)
    ...e ricordati che prima o poi il po-chi gira (Il Maestro)

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.