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

Discussione: SQL che mistero...

  1. #1

    SQL che mistero...

    Ciao a tutti, ho un "piccolo" problemino con delle query SQL:
    lo scenario è questo:
    - tabella "anagrafica" (con le informazioni sulle persone,tra cui un ID_ANAG)
    - tabella "persona_badge" che associa a determinate persone un numero di badge (ID_ANAG,ID_BADGE)

    Adesso il mio scopo è quello di effettuare, tramite una form, una ricerca per cognome. Ovviamente possono essere presenti piu persone con lo stesso cognome. Fin qui nessun problema. Ma se come risultato voglio avere, oltre alle informazioni dei tizi con quel cognome, anche l'EVENTUALE numero di badge?

    Spero di essere stato sufficientemente chiaro... se mi viene un mente un modo migliore per esprimere sta cosa, faccio un edit del post

  2. #2
    Potrei darti immediatamente la soluzione, ma diversamente da come si fa solitamente sul forum, credo sia meglio spiegarti: spiegata una volta la cosa, non avrai più dubbi a riguardo. E' molto semplice.

    Mettiamo che nella tua tabella "anag" vi siano le colonne: nome, cognome, tel, indirizzo, badge.

    Questa è una query MySql:

    $query = "SELECT nome,cognome,tel,indirizzo,badge FROM anag WHERE cognome='$cognome' and nome='mario' ";

    Partiamo da FROM: indica la tabella del db dove cercare i dati
    SELECT: indica i dati da estrapolare da questa tabella
    WHERE: in che punto della tabella estrapolare quei dati. Questa è una condizione , puoi metterne anche più di una, con la congiunzione "and" a dividerle. Puoi passarle "fisse", come nel caso del "nome" o tramite variabili a cui assegni di volta in volta, come nel caso del cognome. Ovvero, con questa query, gli dici di darti i dati dalla tabella anag SOLO DOVE (cioè, intendo dire, nelle righe dove) c'è corrispondenza tra la variabile $cognome e mario.

    Supponendo che tu passi "Rossi" come $cognome, se la congiunzione è "AND" lui prenderà i dati solo di (o dei) MARIO ROSSI. Se la congiunzione è "OR", prenderà tutti i dati di tutti quelli col cognome ROSSI e tutti quelli col nome MARIO.

    Una volta eseguita la query:
    $result = mysql_query($query, $db);

    Se ci sono dei match, ovvero dei riscontri dei dati inseriti, vai a stampare in questo modo:

    while ($row = mysql_fetch_array($result)) {
    echo $row["cognome"] ." ". $row["nome"] ." ". $row["tel"] ." ". $row["indirizzo"] ." ".$row["badge"];
    }

    L'inserimento di ." ". serve per inserire degli spazi tra l'uno e l'altro. Il punto è come un "+" per "sommare" varie cose da scrivere (Se per esempio scrivessi echo "3".$row["nome"]; a schermo leggerei "3mario". Mentre " " indicano lo spazio vuoto, che puoi ovviamente riempire, tipo echo "Nome: ".$row["nome"]; e avrai "Nome: mario".

    Ovviamente puoi stampare solo i dati selezionati con SELECT. Se nel campo SELECT tu avessi inserito solo "SELECT nome,cognome", al momento di stampare non avresti avuto i dati "badge" a disposizione. Perchè, allora, ti chiederai, non prendere sempre tutti i dati dalle tabelle? Beh, perchè ci sono tabelle mostruose che, se ogni volta tu tirassi giù tutti i campi nelle colonne, intaseresti tutto...! In soldoni...

  3. #3
    Apprezzando tantissimo il fatto che tu mi abbia voluto spiegare (e devo dire pure bene) il ragionamento, devo però far notare che la tabella "anag" NON contiene il campo badge. Quest'ultimo si trova su un'altra tabella (insieme all'id della persona). Quindi oltre a sapere le informazioni relative ai tizi (notare il plurale) 'cognome' (informazioni prelevabili dalla tabella "anag") devo anche sapere se questi (o parte di questi) hanno associato un badge (che si trova sulla tabella "persona_badge").

    Faccio un schema delle due tabelle cosi ci intendiamo meglio:

    ANAG
    id_anag, cognome, nome, via ecc...ecc....

    PERSONA_BADGE
    id_persona,id_badge


    (id_anag e id_persona sono la stessa cosa)

  4. #4
    Da quello che ha scritto gasparirob però mi sembra sia necessario eseguire delle congiunzioni...
    Esistono condizioni particolari in cui bisogna prendere i dati in più tabelle.
    In questo caso dovresti usare i JOIN...
    Di questi JOIN ne esistono alcuni tipi, i più importanti sono:
    INNER: si ottengono tutte le righe della prima e della seconda tabella che hanno corrispondenza
    RIGHT: si ottengono tutte le righe della tabella di destra che non hanno corrispondenza cn quella di sinistra
    LEFT: si ottengono tutte le righe della tabella di sinistra che non hanno corrispondenza cn quella di destra

    Se ti faccio un esempio capisci meglio:

    SELECT anagrafica.*, persona_badge.* FROM anagrafica INNER JOIN persona_badge ON anagrafica.ID_ANAG = persona_badge.id_persona WHERE cognome=$cognome and nome=$nome;

    Ora la tabella anagrafica è la tabella di sinistra e la tabella persona_badge è quella di destra.

    ON anagrafica.ID_ANAG = persona_badge.ID_ANAG è il campo in cui le due tabelle coincidono (è fndamentale pe fare il join)

    Le altre parole chiavi le ha spiegate molto bene tommyacoustic19



  5. #5
    Utente di HTML.it L'avatar di Il_Drugo
    Registrato dal
    May 2006
    Messaggi
    1,220
    Puoi usare JOIN, che ti permette di unire più tabelle in base ad un parametro definito da ON

    Codice PHP:
    SELECT anag.*, persona_badge.* FROM anag INNER JOIN persona_badge ON persona_badge.id_persona anag.id_anag WHERE cognome='$cognome' and nome='$nome' 
    So che puo' sembrare complicato ma in realtà è una scemenza. Immagina di fondere le due tabelle come se la colonna id_anag di una andasse a sostituire la colonna id_persona dell'altra tabella.
    Questo è definito da ON e la condizione che viene dopo.

    Il tutto puo' essere semplificato usando degli alias AS, ma non credo sia il caso approfondirlo in questa sede.

    La sintassi del JOIN lo trovi facilmente cercando su google.


  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    867
    Faccio solo un'osservazione a margine.... se ogni diopendente puo' avere solo un badge, come immagino che sia... non e' piu' pratico inserire l'id del badge direttamente dentro alla tabella dei dipendenti ?

    Se invece un dipendente puo' avere piu' di un badge e quindi la relazione e' uno a molti ignora quello che ho scritto

    No pvt per sollecitare risposte, grazie.

  7. #7
    Ti ha già risposto Toxik con un metodo che manco conoscevo...

    Ma non puoi mettere tutto nella stessa tabella?!?

  8. #8
    Originariamente inviato da afurly
    Faccio solo un'osservazione a margine.... se ogni diopendente puo' avere solo un badge, come immagino che sia... non e' piu' pratico inserire l'id del badge direttamente dentro alla tabella dei dipendenti ?

    Se invece un dipendente puo' avere piu' di un badge e quindi la relazione e' uno a molti ignora quello che ho scritto

    Da quello che ha scritto qua
    Ovviamente possono essere presenti piu persone con lo stesso cognome
    sembra che sia una relazione molti a molti...

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    867
    Originariamente inviato da Toxik
    Da quello che ha scritto qua

    sembra che sia una relazione molti a molti...
    Scusa ma non ho capito la tua osservazione... io parlo della relazione tra utenti e badge... gli utenti sono identificato univocamente da ID_ANAG il cognome non capisco cosa centri..... e oltre tutto da quello che ha scritto non possiamo sapere quanti badge possa avere un utente..... ed io immagino uno....
    No pvt per sollecitare risposte, grazie.

  10. #10

    hai ragione
    errore mio

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.