• User

    Ciao,
    ti manca una tabella intermedia che implementi la relazione, qualcosa come
    Tabella portfolio_tecnologia:
    1. id_portfolio
    2. id_tecnologia

    Il campo id_tecnologia naturalmente sparisce dalla tabella portfolio.
    La tabella conterra' record tipo
    1, 1
    1, 3
    2, 1
    3, 2
    .......

    Le tre tabelle andranno quindi JOINate nelle SELECT

    Ciao
    Bruno


  • Super User

    Intanto grazie per la risposta =D
    ma sono ancora un pò titubante su certe cose:

    • la query di join tra le tabelle la vado a creare nel database o la invio da php?
    • Nella terza tabella che dici di creare per attuare la relazione, quale id primario metto tra i 2? Quello del portfolio? delle tecnologie? un terzo campo? Nessuno? =O

  • User

    @karedas said:

    • la query di join tra le tabelle la vado a creare nel database o la invio da php?

    Le relazioni in MySQL sono definite a livello di query, non sono immagazzinate nel database (tipo Access, per intenderci) quindi i JOIN vanno inseriti in ogni query quando servono.

    @karedas said:

    • Nella terza tabella che dici di creare per attuare la relazione, quale id primario metto tra i 2? Quello del portfolio? delle tecnologie? un terzo campo? Nessuno? =O

    Nessun primario, crea un unico indice su entrambi i campi per migliori performance, ma funziona anche senza.

    Ciao
    Bruno


  • User

    se la relazione è Molti a Molti devi creare una tabella intermedia in cui mettere come come chiavi primarie, le stesse chiavi primarie delle due tabelle in relazione. In questa tabella intermedia appena creata dovresti mettere, se presenti, tutte quelle informazioni che sono comuni ad entrambe le tabelle in relazione come ad esempio la data di creazione etc etc.
    Se invece crei una tabella 1:M devi creare la tabella che ha relazione 1,con i campi normali senza nessun riferimento di campi all'altra tabella. Invece l'altra devi aggiungere ai campi che avevi già stabilito, il campo di chiave primaria dell'altra tabella.
    Spero di essere stato d'aiuto.
    :);)


  • User

    Se invece crei una tabella 1:M devi creare la tabella che ha relazione 1,con i campi normali senza nessun riferimento di campi all'altra tabella. Invece l'altra devi aggiungere ai campi che avevi già stabilito, il campo di chiave primaria dell'altra tabella.Anche in questo caso hai bisogno di una tabella intermedia, altrimenti ti ritrovi a duplicare i dati per ogni M record che fanno riferimento alla tabella 1 con conseguente incremento di spazio su disco, difficolta' di manutenzione del database e rischi di inconsistenza dovuti alla ridondanza dei dati.

    Ciao
    Bruno


  • Super User

    Ma quindi ponendo il fatto che esistono siti con un unico nome e url ma per lo stesso sito più tecnologie, come devo realizzare la terza tabella?
    Con le foreign keys? No perchè fintanto c'è da creare database normali ok, ma in mysql inciampo un pò =D


  • User

    Ciao,
    @karedas said:

    Ma quindi ponendo il fatto che esistono siti con un unico nome e url ma per lo stesso sito più tecnologie, come devo realizzare la terza tabella?
    Con le foreign keys? No perchè fintanto c'è da creare database normali ok, ma in mysql inciampo un pò =D

    Le foreign keys sono supportate solo nell'InnoDB engine (meno performante) e sono usate SOLO per verificare e forzare l'integrita' dei dati, le referenze tra le tabelle vengono ancora impostate nella query usando JOIN.

    Io la tabella la farei cosi':
    CREATE TABLE portfolio_tecnologia (
    id_portfolio int(10) NOT NULL default '0',
    id_tecnologia int(10) NOT NULL default '0',
    PRIMARY KEY (id_portfolio,id_tecnologia)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

    Le SELECT qualcosa come
    SELECT p., t. FROM portfolio_tecnologia pt
    LEFT JOIN portfolio p ON pt.id_portfolio=p.id_portfolio
    LEFT JOIN tecnologia t ON pt.id_tecnologia=t.id_tecnologia
    WHERE ....

    Comunque provale in MySQLAdmin e vedi se ti ritrovi i risultati voluti (magari ci ho messo anche qualche errore, non le ho provate 🙂 )

    Ciao
    Bruno


  • Super User

    ok grazie capito!
    Ah una delucidazione nel linguaggio sql. Io lo so usare a livelli basilari.
    Le abbreviazioni sulla select (p.* , t.* ) e il pt ....
    insomma quelli! Come funzionano in sintassi?


  • Super User

    No ho provato e non è venuto ciò che volevo io, probabilmente mi sono spiegato male.

    Faccio un esempio + dettagliato x farvi capire quello che voglio. Non so come strutturarlo.

    Allora come abbiamo detto sopra ho questa famosa tabella "PORTFOLIO".
    Ogni riga contiene un array di dati sopra citati. Tra questi ci vorrei mettere anche le tecnologie usate nella creazione del sito medesimo.

    Quindi come detto sempre sopra creo una seconda tabella e ci metto l'id della tecnologia e il nome (php, java, html, ecc ecc).

    Adesso: siamo arrivati al punto di creare una terza tabella che crei un'integrità referenziale tra PORTFOLIO E TECNOLOGIA in modo da poter dimezzare le risorse e avere un lavoro + ordinato.

    Io ho creato questa terza tabella e nel php ho inviato la query cn il Left join (scritta da bruno). Tramite:

    [php]$query= 'la query di bruno';
    $oggetti=connection::sendQuery($query);
    while($riga=mysql_fetch_row($oggetti){
    //stampa ciò che voglio richiamando ogni singolo elemento
    }[/php]Allora stampare lo fa, richiamare i dati anche.
    Ma è proprio in questo che nn torna quello che voglio fare!
    Ad esempio se ho 1 sito (Www.sito.it) , il ciclo si ripete per ogni tecnologia presente e quindi:
    (esempio 10 tecnologie nel database)
    Stampa 10 volte 1 sito per 10 tecnologie presenti e poi passa al secondo!

    Insomma non è questo che voglio!


  • User

    Ciao,
    la query ti ha ritornato i dati di cui hai bisogno, cioe' l'associazione tra url e tecnologia. Ora e' una questione di adattare i dati a quello che vuoi fare.

    [php]
    $query= 'la query di bruno';
    $oggetti=connection::sendQuery($query);
    $UrlId=-1;
    while($riga=mysql_fetch_row($oggetti){
    if ($UrlId!=$riga->id_portfolio) {
    if ($UrlId>=0) print "\n" . $out;
    $UrlId=$riga->id_portfolio;
    $out='Url id =' . $riga->id_portfolio . 'Tecnologie: ';
    }
    $out.=$riga->nome_tecnologia . ' ';
    }
    print "\n" . $out;
    [/php]Questo stampa (o dovrebbe stampare) una riga per url con le tecnologie appese in coda.

    Ciao
    Bruno


  • User

    @karedas said:

    ok grazie capito!
    Ah una delucidazione nel linguaggio sql. Io lo so usare a livelli basilari.
    Le abbreviazioni sulla select (p.* , t.* ) e il pt ....
    insomma quelli! Come funzionano in sintassi?

    Sono alias per il nome della tabella che precede, aiutano parecchio in leggibilita' quando hai nomi lunghi per le tabelle.

    Ciao
    Bruno


  • User

    Scusa, l'esempio sopra usa mysql_fetch_row ma si riferisce ai dati come se avesse usato mysql_fetch_object (abitudine...), il while deve essere letto come

    while($riga=mysql_fetch_object($oggetti){

    Ciao
    Bruno


  • User Newbie

    Ciao, sono parecchio alle prime armi, quindi scusatemi se dico cose assurde.
    Ho lo stesso problema di karedas, il join funziona, pero' quando stampo mi escono valori ripetuti.
    Sto utilizzando questo codice:

    $result2 = mysql_query($sql);
    $result = mysql_query($sql);
    $numrows = mysql_num_rows($result2);
    for($x=0; $x<$numrows; $x++){
    $resrow = mysql_fetch_row($result2);
    $row = mysql_fetch_array($result);
    $titolo = $resrow[1];
    $citta = $resrow[2];
    $nomeprevendita = $row['nome'];
    echo "$nomeprevendita";
    echo "<br>";

    Ciao!