Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    Query sql tra + tabelle problema!

    Scusate la mia "gnoranza" in manteria, ma stò sviluppando un piccolo applicativo e mi sono reso conto che le query che avevo creato non tira fuori i risultati sperati.

    Il mio problema sinteticamente è il seguente:

    4 tabelle
    -----------------------
    1. tb_utenti
    id_utente
    nome
    id_citta_fk
    id_regione_fk
    id_nazione_fk

    2. tb_citta
    id_citta
    id_regione_fk
    citta

    3. tb_regione
    id_regione
    id_nazione_fk
    regione

    4. tb_nazione
    id_nazione
    nazione
    ------------------------

    E adesso la query sbagliata che ho realizzato e poi spiego il perché:

    select * from tb_utenti INNER JOIN
    tb_regione ON tb_utenti.id_regione_fk = id_regione
    LEFT JOIN tb_citta ON id_regione = tb_citta.id_regione_fk
    LEFT JOIN tb_nazione = ON tb_regione.id_nazione_fk = id_nazione
    WHERE id_utente = 22

    In pratica voglio stampare a video una cosa del genere:

    id_utente=22,
    nome=paolo,
    citta=Milano,
    regione=Lombardia,
    nazione=Italia

    ma il raffronto che voglio ottenere con la tabella utenti (tb_utenti) deriva solo dalla regione (tb_regione).

    In pratica voglio stampare una sorta di "path" dell'utente paolo partendo dalle regione (perché potrebbe essere in alcuni casi, che l'utente nella sua iscrizione abbia tralasciato di inserire la sua citta (tb_utenti.id_citta_fk) e quindi se dovessi fare la query raffrontandola con la citta e non con la regione, rischierei di non vedere visualizzati molti utenti)

    Non so se sono stato chiaro e se ci sono ulteriori domande...

    grazie

  2. #2
    non mi è molto chiaro quello che hai fatto.
    con il tuo script io posso dire di essere della città di milano nella regione lazio e nella nazione germania.

    perchè invece non memorizzi direttamente la città e basta?

    la pagina potresti realizzarla in questo modo:
    1) mostri l'elenco delle nazioni, sull'onchange del controllo ricarichi la pagina passando come parametro nella query string l'id (magari criptato) della nazione.

    2) carichi l'elelnco delle nazioni con quella che ha scelto già selezionata e mostri il controllo delle regioni.
    stesso discorso, quando sceglie la regione ricarichi la pagina passando come parametri sia l'id della nazione che quelo della regione nella query string. e mostri l'elenco delle città ovviamente filtrato in base alle scelte precedentemente fatte.

    quando sceglie anche la città memorizzi nel database solamente l'id della città. a questo punto sai sia la regione che la nazione e sei sicuro che non si inventa di stare a miami lombardia polonia.

    altrimenti sai che fantasie che si scatenano?

  3. #3
    Moderatore di Server Apache L'avatar di marketto
    Registrato dal
    Sep 2001
    Messaggi
    5,858
    prova qst:
    codice:
    SELECT tb_utenti.id_utente,tb_utenti.nome,tb_citta.citta,tb_regione.regione,tb_nazione.nazione FROM tb_utenti
    INNER JOIN tb_regione ON tb_regione.id_regione=tb_utenti.id_regione_fk
    LEFT JOIN tb_citta ON tb_citta.id_citta=tb_utenti.id_citta_fk
    LEFT JOIN tb_nazione ON tb_nazione.id_nazione=tb_utenti.id_nazione_fk
    WHERE tb_utenti.id_utente = 22;
    chiaramente il campo tb_utenti.id_regione_fk deve avere sempre un valore altrimenti la query nn va.
    think simple think ringo

  4. #4

    pero'

    la necessità di registrare nella tb_utenti i valori:

    id_citta_fk
    id_regione_fk
    id_nazione_fk

    nasce dal fatto che l'ambizione è grande...
    o meglio...

    Ho cercato di codificare nelle rispettive tabelle (citta, regioni) tutte quelle relative a tutte le nazioni del mondo. Ovviamente, non ci sono riuscito in tutti i casi (vai a trovare le "province" della regione del Burundi o dell'Angola..., magari con il tempo ci riuscirò, ma per adesso devo adattare) e quindi se l'utente si registra e magari è un utente del Burundi, la sua "path" nella tabella utenti si fermerà alla nazione (id_nazione_fk) e quindi verrà escluso datta query che cerca in id_citta_fk.

    Ho deciso, che il punto di partenza saranno le regioni, perché sicuramente sono le più complete...

    In pratica immagina HTML.it, nel quale ha una sezioni news relativa ad ogni singola regione d'italia (tb_news che ovviamente ha anche i soliti record id_nazione_fk, ecc.) Adesso l'utente entra in html.it e entra nelle news relative al lazio. Oltre alle news solo del lazio, troverà tutti gli utenti che sono di questa regione e magari tutti i siti web (tb_directory stesso principio) sempre del lazio.

    In pratica faccio un filtro in base all'id_regione e tiro fuori tutti i dati relativi...

    Pensavo di dover fare delle sotto query per risolvere il problema..
    Allo stato attuale non funziona bene

  5. #5

    FACCIO UN ESEMPIO CONCRETO

    mi stò per registrare:

    ----------------------
    di che nazione sei?

    Seleziona nazione:
    Algeria
    Italia
    Burundi
    ecc
    ---------------------
    Hai selezionato Algeria ma quale regione?

    Seleziona regione:
    Adrar
    Lazio
    Molise
    ecc.
    ----------------------
    Hai selezionato Adrar in Algeria?

    (adesso non trova le città di Adrar)
    Quindi, in questo caso
    registro in tb_utenti solo id_nazione_fk e id_regione_fk
    Questo è il motivo che mi costringe a inserire in tb_utenti sia la nazione che la regione che la citta.
    Ovviamente devo prevedere anche casi che l'utente trovi tutta la sua "path di località" (italia > Lazio > Roma)


    -------------------------------
    Ma tornando a noi la query mi serve perché in una pagina di profilo utente voglio visualizzare la sua path di località (tb_utenti)
    partendo dalla sua regione (perché al 90% ho quelle di tutto il globo).

    Quindi la query deve andare bene sia per
    (tb_utenti)paolo (tb_nazione)Italia (tb_regione)Lazio (tb_citta)Roma

    sia per:
    (tb_utenti)Moamedd (tb_nazione)Algeria (tb_regione)Adrar

    claro!!??

  6. #6
    Moderatore di Server Apache L'avatar di marketto
    Registrato dal
    Sep 2001
    Messaggi
    5,858
    hai provato la mia query?
    think simple think ringo

  7. #7

    credo che non vada..

    LEFT JOIN tb_citta ON tb_citta.id_citta=tb_utenti.id_citta_fk

    (estrapolata dalla tua query)

    Domanda:
    E se l'utente non ha registrato nella tb_utenti la sua id_citta_fk (potrebbe essere che nelle registrazione la nazione algeria con le sue regioni es. adrar nelle quali ci dovrebbero essere le citta relative non sono ancora state inserite (da me) e quindi l'utente è costretto a fermarsi alla regione.

    Io voglio una query che:
    - mi visualizzi la path (nazione, regione, citta) dell'utente paolo ma che l'utente paolo nella registrazione mi garantisca almeno di registrare la sua località fino alla regione, ciò nonostante se inserisce anche la città mi deve apparire.
    In pratica:

    select * from tb_utenti
    INNER JOIN tb_regione ON tb_utenti.id_regione_fk = id_regione
    LEFT JOIN tb_nazione ON tb_regione.id_nazione_fk = id_nazione
    (MA se presente tb_utenti.id_citta_fk MI FAI ANCHE
    LEFT JOIN tb_citta ON tb_utenti.id_citta_fk = id_citta)
    WHERE id_utente = 22

    In questo modo stampo sia fino alla regione che se presente anche la citta!

    Come fò?

  8. #8
    Moderatore di Server Apache L'avatar di marketto
    Registrato dal
    Sep 2001
    Messaggi
    5,858
    se il campo tb_utenti.id_citta_fk è vuoto la query restituisce lo spazio vuoto, lasciando invariato il resto.

    es:
    id_utente|nome |citta|regione |nazione
    ---------------------------------------
    1 |paolo| |lombardia|italia
    think simple think ringo

  9. #9

    adesso la provo...

    adesso la provo... ma il fatto che non trovi il campo id_citta_fk non valorizzato non fa fallire la query?

  10. #10
    Se i campi indicati sono i soli non serve fare tante tabelle...

    Si tratta di un indirizzo dove i dati sono univoci. A meno che nelle nazioni , citta ecc.. ci sia una pletora di altre info che non vuoi duplicare.

    In pratica invece di scrivere l'id, scrivi il nome e fai prima. Tanto sono dati non soggetti a cambiamento (nazione citta' provincia) se non per eventi eccezionali....


    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

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.