Visualizzazione risultati 1 fino 14 di 14

Discussione: Join tra due tabelle in base all'id.

  1. #1
    Guest

    Predefinito Join tra due tabelle in base all'id.

    Allora ragazzi, mi sono messo a studiare le JOIN ma è un casotto grande Non ci capisco nulla dalle guide

    Allora, ho due tabelle chiamate ip_bands che ha questi campi:
    Codice:
    id             	int(5)             auto_increment
    name           varchar(255)
    genre         	text
    formed_city 	varchar(63)
    formed_date 	text
    website 	varchar(63)
    members 	varchar(255)
    ed un'altra chiamata ip_albums_bands.
    Codice:
    id             	int(5)             auto_increment
    id_band        int(5)
    name_album     text
    date_album 	int(4)
    Ora, devo fare (da quel che ho capito) una JOIN tra le due tabelle.

    Ho messo in relazione id_band della seconda tabella con id della prima.

    Praticamente nella seconda ci sarà un record per ogni album.

    Ora, come devo fare la query in modo che mi mostri gli album in base all'ID del primo album?

    Grazie

  2. #2
    Guest

    Predefinito

    Codice:
    SELECT b.*, a.*
    FROM ip_bands AS b
    JOIN ip_albums_bands AS a ON a.id_band=b.id

    Ciaooooo!

  3. #3
    Guest

    Predefinito

    Grazie mille debug, veloce ed efficace come sempre!

    Ma potrersti spiegarmi in poche parole, ma a prova di scemo, quello che fa al query?

    In modo che mi rimanga in testa e magari la prossima volta faccia da solo


    Perchè è una query dinamica, che deve variare in base all'ID passato via GET!

  4. #4
    Guest

    Predefinito

    Tradotto:

    Seleziona tutti i campi delle due tabelle
    Mettendo in relazione il campo id_band della tabella ip_albums_bands
    con il campo id della tabella ip_bands


    Ciao!!!

  5. #5
    Guest

    Predefinito

    Ma come faccio a cambiare id e id_name?

    Ho aggiunto dopo, che la query varia in base al valore passato via GET.

    Cioè, devo selezionare da ip_albums_bands tutti gli album dell'ID di ip_bands.

    Supponendo che sia 1, devo selezionare in ip_albums_bands tutti gli album che hanno id_band = 1

  6. #6
    Guest

    Predefinito

    Aggiungi la clasuola con WHERE:

    SELECT ...
    FROM ...
    JOIN ...
    WHERE b.id= $id


    Ciao!

  7. #7
    Guest

    Predefinito

    Succede un casotto, mi si mischiano tutti i dati quando li vado a visualizzare

    Allora ho questo codice:

    Codice PHP:
    $sql = 'SELECT b.*, a.*
    FROM ip_bands AS b
    JOIN ip_bands_albums AS a ON a.id_band=b.id
    WHERE b.id='
    . $_GET['id'];

    if (!
    $result = $db->sql_query($sql))
    {
    message_die(GENERAL_ERROR, 'Couldn\'t retrieve band data', '', __LINE__, __FILE__, $sql);
    }
    else
    {
    while (
    $row = $db->sql_fetchrow($result))
    {
    $band_id = $row['id'];
    $band_name = $row['name'];
    $genre_array = explode("/", $row['genre']);
    foreach(
    $genre_array as $genre)
    {
    $template->assign_block_vars('band_view_genre', array(
    'BAND_GENRE' => $genre,
    ));
    }
    $band_city_formed = $row['formed_city'];
    $band_date_formed = $row['formed_date'];
    $band_name_album = $row['name_album'];
    $band_date_album = $row['date_album'];
    $band_website = $row['website'];
    $band_members = $row['members'];

    (
    $board_config['url_rw'] == '1') || (($board_config['url_rw_guests'] == '1') && ($userdata['user_id'] == ANONYMOUS)) ? $view_band_url = append_sid(str_replace ('--', '-', make_url_friendly($band_name) . '-band-id' . $band_id . '.html')) : $view_band_url = append_sid('band.' . PHP_EXT . '?id=' . $band_id);

    (
    $userdata['user_level'] = ADMIN) ? $url_band_edit = '<a href="band.' . PHP_EXT . '?edit=' . $band_id . '">' . $lang['Edit_delete_post'] . '</a>' : '&nbsp;';

    $template->assign_block_vars('band_view', array(
    'BAND_ID' => $band_id,
    'BAND_NAME' => $band_name,
    'BAND_GENRE' => $band_genre,
    'BAND_CITY' => $band_city_formed,
    'BAND_DATE' => $band_date_formed,
    'BAND_ALBUM_NAME' => $band_name_album,
    'BAND_ALBUMDATE' => $band_date_album,
    'BAND_WEBSITE' => $band_website,
    'BAND_MEMBERS' => $band_members,
    'U_VIEW_BAND' => $view_band_url,
    'U_EDIT_BAND' => $url_band_edit,
    ));
    }
    }
    Ma se vai qui vedi cosa succede: http://finnishmetal.altervista.org/s...-band-id1.html

    E se non ci osno album non mi mostra le altre cose nemmeno come per esempio: http://finnishmetal.altervista.org/c...-band-id2.html

    L'unico rimane fare due query separate!

  8. #8
    Guest

    Predefinito

    Così non ci capisco molto.
    Esegui la query dentro phpmyadmin e vedi cosa ti tira fuori; e in caso postalo qui.


    Ciao!

  9. #9
    Guest

    Predefinito

    Eseguendo questa query:
    Codice:
    SELECT b . * , a . *
    FROM ip_bands AS b
    JOIN ip_bands_albums AS a ON a.id_band = b.id
    WHERE b.id =1
    Mi viene restituito questo:


    Dovrebbe essere giusto ma non capisco perchè mi incasina tutto

  10. #10
    Guest

    Predefinito

    Se è giusto, che significa che "incasina tutto"?
    Puoi usare qualche parola italiana ed essere più dettagliato?


    Ciao!

  11. #11
    Guest

    Predefinito

    Ho postato il link per farti vedere perchè era difficile da spiegare

    Ho cambiato alcune cosettine, che dipendevano anche dalla posizione degli array e ora si vede tutto bene.

    Però ho un problema sempre relativo all'uso delle JOIN.

    Dovrei fare un INSERT INTO quando inserisco nuove informazioni, mentre un UPDATE quando modifico.

    Ho letto delle guide su mr webmaster e/o su html.it ma non ci capisco nulla. Non spiegano la sintassi e non capisco come potrei fare la query.

    Quando io quando modifico modifico, faccio questa query per prendere tutti i dati:
    Codice PHP:
    $sql = 'SELECT band.*, album.*, members.*
    FROM ip_bands AS band
    JOIN ip_bands_albums AS album ON album.id_band=band.id
    JOIN ip_bands_members AS members ON members.id_band=band.id
    WHERE band.id='
    . mysql_real_escape_string($_GET['id']);
    Per modificarli, credo, dovrei fare una cosa così, avendo dei campi che verranno inviati via POST:
    Codice PHP:
    $band_name = htmlspecialchars(trim($_POST['name']));
    $band_genre = htmlspecialchars(trim($_POST['genre']));
    $band_city_formed = htmlspecialchars(trim($_POST['formed_city']));
    $band_date_formed = htmlspecialchars(trim($_POST['date_formed']));
    $band_name_album = htmlspecialchars(trim($_POST['name_album']));
    $band_date_album = htmlspecialchars(trim($_POST['date_album']));
    $band_website = htmlspecialchars(trim($_POST['website']));
    $band_member_drum = htmlspecialchars(trim($_POST['member_drum']));
    $band_member_voice = htmlspecialchars(trim($_POST['member_voice']));
    $band_member_keyboard = htmlspecialchars(trim($_POST['member_keyboard']));
    $band_member_bass = htmlspecialchars(trim($_POST['member_bass']));
    $band_member_guitar_1 = htmlspecialchars(trim($_POST['member_guitar_1']));
    $band_member_guitar_2 = htmlspecialchars(trim($_POST['member_guitar_2']));
    $band_member_guitar_3 = htmlspecialchars(trim($_POST['member_guiatr_3']));
    Codice PHP:
    $sql = 'UPDATE ip_bands AS band,
    ip_bands_albums AS album,
    ip_bands_members AS member
    SET band.name=\''
    . mysql_real_escape_string($band_name) . '\',
    band.genre=\''
    . mysql_real_escape_string($band_genree) . '\',
    band.city_formed=\''
    . mysql_real_escape_string($band_city_formed) . '\',
    band.website=\''
    . mysql_real_escape_string($band_webiste) . '\',
    member.drum=\''
    . mysql_real_escape_string($band_member_drum) . '\',
    member.voice=\''
    . mysql_real_escape_string($band_member_voice) . '\',
    member.keyboard=\''
    . mysql_real_escape_string($band_member_keyboard) . '\',
    member.bass=\''
    . mysql_real_escape_string($band_member_bass) . '\',
    member.guitar_1=\''
    . mysql_real_escape_string($band_member_guitar_1) . '\',
    member.guitar_2=\''
    . mysql_real_escape_string($band_member_guitar_2) . '\',
    member.guitar_3=\''
    . mysql_real_escape_string($band_member_guitar_3) . '\',
    WHERE band.id=\''
    . mysql_real_escape_string($band_id) . '\'
    AND member.id_band=\''
    . mysql_real_escape_string($band_id) . '\'
    AND album.id_name=\''
    . mysql_real_escape_string($band_id) . '\');'
    Mentre mi rimane il problema degli album, dovre mettere tanti input quanti sono gli album, assegnare loro il nome e la data per non incasinarsi i dati e poi magari aggiungerne tanti quanti sono quelli scelti dall'utente, sempre in base ad un valore passato via POST.

    Per INSERT INTO invece non ho minimamente idea di cosa potrei fare

    Grazie in anticipo per l'aiuto, sto creando questo script più velocemente di quanto immaginavo grazie al vostro aiuto
    Ultima modifica di biccheddu : 17-02-2009 alle ore 17.03.51

  12. #12
    Guest

    Predefinito

    Quando esegui un UPDATE devi specificare solo quei dati che devono essere modificati.
    Per la sintassi della query con UPDATE guarda la guida di riferimento sul sito mysql.com

    Per l'insert stessa cosa: guarda la guida, ci sono anche vari esempi sui vari usi.


    Ciao!

  13. #13
    Guest

    Predefinito

    I controlli li faccio e funziona tutto perfettamente, mi rimangono ancora da gestire gli album, ora mi devo inventare il metodo

    Per le INSERT INTO ho trovato questo esempio:
    Codice:
    INSERT INTO TargetTable (col1, col2, col3)
    SELECT col1,col2,col3
    FROM SourceTable JOIN (SELECT 'ExplicitValue' AS col3) AS AnyAlias
    Ma non so se si possa operare su tre tabelle! Cioè, non ho capito nemmeno come devo fare per operare su due

    Da quel che ho capito sembra dica:
    Inserisci nella tabella TargetTabel, nei campi col1, col2, col3, i dati presi dai campi col1, col2, col3, della tabella SourceTable.

    Però io non li devo prendere da un'altra tabella, ma devo fare la query con i dati passati via POST!



    Mi scuso se ho dato l'impressione di volere la pappa pronta, ma lavoro da avantieri con il linguaggio SQL e magari alcune cose, come questa, non le capisco

  14. #14
    L'avatar di dementialsite
    dementialsite non è connesso Super Moderatore
    Data registrazione
    19-10-2004
    Residenza
    fuori Padova
    Messaggi
    5,046

    Predefinito

    Per quanto riguarda l'aggiornamento, sebbene esista una sintassi a tabelle multiple, è piuttosto complicata da comprendere: meglio quindi eseguire più query ed aggiornare una tabella alla volta. Questa la sintassi generica:
    Codice:
    UPDATE {nome tabella}
    SET {operazioni di aggiornamento}
    WHERE {condizioni per selezionare il/i record dove applicare l'aggiornamento}
    Per quanto riguarda l'inserimento, si può fare solo a tabella singola. La sintassi che hai postato serve solo a copiare dati da una tabella "compatibile per copia", per inserire valori nuovi di solito si usa questa sintassi:
    Codice:
    INSERT nome_tabella (campo1, campo2, ..., campoN) VALUES 
    (valore11, valore12, ..., valore1N),
    (valore21, valore22, ..., valore2N),
    ...
    (valoreM1, valoreM2, ..., valoreMN)
    Stammi bene...
    Le questioni tecniche hanno risposte migliori nel forum pubblico, non trovi?

    When you don't know your next step... improvise

    ALTERVISTA WANTS YOU!
    Vuoi diventare moderatore su AlterVista? Scopri come...

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •