Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it L'avatar di Base
    Registrato dal
    Apr 2001
    Messaggi
    822

    [php] [mysql] ricerca su campo comune in 4 tabelle

    Salve a tutti,
    Mi sto imbattendo per la prima volta sulla ricerca su più tabelle, e in base alle mie esigenze non so come esattamente devo strutturare la query e che funzioni MYSQL devo usare.


    in un db ho 4 tabelle:
    reg_coll
    reg_cont
    reg_corsi
    reg_sped

    le tabelle sono simili ma differenti, i campi in comune che hanno sono
    id - nome - cognome .

    ora vorrei dare la possibilità all'utente di cercare solo nel campo cognome di queste 4 tabelle e ottenere gli id corrispondenti con il nome della tabella corrispondente.

    ad es:
    cerca ROSSI

    risultato:
    id | cognome | nome | tabella
    3 | ROSSI | MARIO | reg_coll
    2 | ROSSI | ALDO | reg_sped

    ovviamente mi basta la query con le funzioni giuste da utilizzare e capire come estrarre gli id e il nome tabella poi con ciclo while creerò la tabella come meglio credo.
    mi sapreste aiutare?
    Grazie in anticipo.

  2. #2
    Utente di HTML.it L'avatar di Base
    Registrato dal
    Apr 2001
    Messaggi
    822
    volevo evitare di fare figuracce, e postare il codice.
    ma visto che non ottengo risposte... io ho provato così
    Codice PHP:
    $query mysql_query("SELECT * FROM reg_coll, reg_cont, reg_sped, reg_corsi AS tabelle WHERE tabelle.cognome = 'Rossi' "); 
    while (
    $dati mysql_fetch_array($query))
    {
    echo 
    "{$dati['id']} {$dati['nome']} {dati['cognome']}
    "
    ;

    sono in alto mare?
    questa query non mi da risultati, eppure esiste un Rossi nella tabella reg_coll.
    mi aiutate per favore?

  3. #3
    Ciao,
    in pratica hai bisogno di unire le 4 tabelle per tirare fuori dei dati giusto?

    La cosa semplice è questa:
    Presupposto ID è la chiave di ogni tabella (interna ed esterna per quanto riguarda le altre tabelle)

    SELECT * FROM
    reg_coll
    INNER JOIN reg_cont ON reg_coll.ID=reg_cont.ID AND
    INNER JOIN reg_sped ON reg_coll.ID=reg_sped.ID
    INNER JOIN reg_corsi ON reg_coll.ID=reg_corsi.ID
    WHERE
    LE TUE CONDIZIONI...

    In questo modo hai unito le tabelle (sempre secondo il presupposto che la gestione delle chiavi sia coerente).

  4. #4
    Utente di HTML.it L'avatar di Base
    Registrato dal
    Apr 2001
    Messaggi
    822
    grazie per la risposta...
    ok, incomincio a focalizzare la soluzione ma in parte...
    a questo punto mi servirebbe anche la sintassi corretta della condizione perchè non saprei come farla.
    devo cercare il cognome in tutte le tabelle, devo specificarlo per ogni tabella? o basta campo e valore...
    tipo:
    Codice PHP:
    $query "SELECT * FROM reg_coll INNER JOIN reg_cont ON reg_coll.ID=reg_cont.ID AND INNER JOIN reg_sped ON reg_coll.ID=reg_sped.ID INNER JOIN reg_corsi ON reg_coll.ID=reg_corsi.ID [B]WHERE cognome = 'Rossi' [/B]  "
    per quanto riguarda la chiave interna ed esterna, cosa intendi?
    io ho semplicemente creato ogni tabella con la prima colonna che è un ID int(11) con auto_increment ed è la chiave primaria.

    è la prima volta che affronto questo tipo di operazione e avrei bisogno di capire bene....
    grazie.

  5. #5
    Utente di HTML.it L'avatar di Base
    Registrato dal
    Apr 2001
    Messaggi
    822
    ho provato in questo modo:
    Codice PHP:
    $query mysql_query("SELECT * FROM reg_coll INNER JOIN reg_cont ON reg_coll.ID=reg_cont.ID AND INNER JOIN reg_sped ON reg_coll.ID=reg_sped.ID INNER JOIN reg_corsi ON reg_coll.ID=reg_corsi.ID WHERE cognome = 'Rossi' ") or die ("ERRORE".mysql_error());  
    while (
    $dati mysql_fetch_array($query)) 

    echo 
    "{$dati['id']} {$dati['nome']} {$dati['cognome']}
    "


    mi da un errore di sintassi anche senza la causola WHERE.

    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INNER JOIN reg_sped ON reg_coll.ID=reg_sped.ID INNER JOIN reg_co
    :master:
    sto scrivendo cappellate??

  6. #6
    Utente di HTML.it L'avatar di Base
    Registrato dal
    Apr 2001
    Messaggi
    822
    nessuno sa aiutarmi?

  7. #7
    Allora la cosa importante da tenere in considerazione è che la chiave sia giusta.... quindi la riga contraddistinta dall'id 1 nella tabella 1 deve avere un legame logico indissolubile con il record 1 nella tabella 2 e via dicendo, se sei certo di questo veniamo alla query.

    Posso immaginare che in tutte le tabelle dove la chiave è 1 il campo cognome sia posto ad esempio a ROSSI (ammesso e non concesso che sia vero dipende da che cosa rappresentano le tue tabelle)
    In questo tipo ti basta specificare una sola condizione nella where, se così non fosse devi specificarle tutte.

    L'errore penso che sia dovuto al where, infatti tu hai scritto cognome='qualcosa' però non hai specificato a chi appartine il campo cognome. Il db in questo caso si ritrova ad avere logicamente una tabellona com 4 campi cognome quindi non sa cosa scegliere, per specificarlo devi scrivere nome_tabella.nome_campo

    Altro errore sta nelle inner, per questo ti consiglio di dare una bella letta al manuale dove parla dei tipi di join possibili, perchè alla fine tutto l'sql ruota attorno a quelle 3 o 4 pagine per il resto puoi anche avere solo un'idea di base, comunque l'errore sta nell' AND

    La sintassi è:

    SELECT *
    FROM TAB1
    INNER JOIN TAB2 ON <CONDIZIONI>
    INNER JOIN TAB3 ON <CONDIZIONI>

    Quindi nel tuo caso dovresti avere:

    codice:
    SELECT * FROM reg_coll 
       INNER JOIN reg_cont ON reg_coll.ID=reg_cont.ID 
       INNER JOIN reg_sped ON reg_coll.ID=reg_sped.ID 
       INNER JOIN reg_corsi ON reg_coll.ID=reg_corsi.ID 
    WHERE cognome = 'Rossi'

    Nel caso in cui le <CONDIZIONI> siano più di una allora aggiungi un operatore (AND,OR...) ma solo per legare le condizioni.

    Prova a correggere e se le chiavi sono giusti vedrai che funziona, comunque dai una letta al manuale che poi ci sono parecchie sfumature interessanti.

    gigio

  8. #8
    Utente di HTML.it L'avatar di Base
    Registrato dal
    Apr 2001
    Messaggi
    822
    ok.. mi sembra chiaro..
    non coicide però il ragionamento delle chiavi con le ie tabelle..
    questo perchè ogni tabella "vive di vita propria" cioè sono quattro tabelle che si riempono in base a 4 form. quindi l'id 3 della tabella 1 non corrisponde all' id 3 della tabella 2.
    tutti hanno campi id - nome - cognome ma hanno dati differenti.

  9. #9
    beh allora tutto il discorso fatto non ha più senso.... a questo punto devi usare una union all.... i join servono per legare cose logicamente correlate...

    a questo punto devi fare un:

    SELECT * FROM TAB1 WHERE COG='ROSSI'
    UNION ALL
    SELECT * FROM TAB2 WHERE COG='ROSSI'
    UNION ALL
    SELECT * FROM TAB3 WHERE COG='ROSSI'
    UNION ALL
    SELECT * FROM TAB4 WHERE COG='ROSSI'

    In questo modo fondi le tabelle accodando i risultati degli altri...
    Leggi bene la documentazione delle union che ci sono delle limitazioni... ad esempio le tabelle in union devono avere gli stessi campi (o reali o rinominandoli)
    Ti consiglio però di fare una gestione un po' più oculata delle tabelle... visto che quei dati li devi recuperare ti conviene legarli un qualche modo...

    gigio

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.