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

Discussione: Query tripla in SQL

  1. #1

    Query tripla in SQL

    Ciao a tutti

    Vorrei ridurre a una sola query questa richiesta SQL:

    codice:
    // recupera, dato l'id, l'id del tipo di locale
    $infoSQL = "SELECT tipo FROM locali WHERE id = ".$id;
    $info_query = mysql_query($infoSQL, $ConnessioneMysql) or die(mysql_error());
    $info_array = mysql_fetch_assoc($info_query);
    $info = $info_array['tipo'];
    	
    // recupera, dato l'id del tipo, il nome della tabella al quale si riferisce
    $infoSQL = "SELECT tabella FROM tipi WHERE id = ".$info;
    $info_query = mysql_query($infoSQL, $ConnessioneMysql) or die(mysql_error());
    $info_array = mysql_fetch_assoc($info_query);
    $info = $info_array['tabella'];
    
    // recupera, dato id e tabella, le informazioni sul locale
    $infoSQL = "SELECT * FROM ".$info." WHERE id = ".$id;
    $info_query = mysql_query($infoSQL, $ConnessioneMysql) or die(mysql_error());
    $info_array = mysql_fetch_assoc($info_query);

    Sono riuscito a ridurla a 2 query in questo modo:

    codice:
    $infoSQL = "SELECT tabella FROM tipi WHERE id = (SELECT tipo FROM locali WHERE id = ".$id.")";
    $info_query = mysql_query($infoSQL, $ConnessioneMysql) or die(mysql_error());
    $info_array = mysql_fetch_assoc($info_query);	
    
    $infoSQL = "SELECT * FROM ".$info_array['tabella']." WHERE id = ".$id;
    $info_query = mysql_query($infoSQL, $ConnessioneMysql) or die(mysql_error());
    $info_array = mysql_fetch_assoc($info_query);
    Purtroppo non riesco a ridurla ulteriormente, dato che non posso scrivere:

    "SELECT * FROM ( SELECT tabella FROM tipi WHERE id = (SELECT tipo FROM locali WHERE id = ".$id." ) WHERE id = ".$id

    altrimenti SQL cerca in una tabella inutile, mentre dovrebbe prendere il nome della tabella...



    Any ideas?

    Grazie!
    Teejay - Just a Flash Web-designer

    L4TN.net - Live4theNight, Enjoy your night life!

  2. #2
    up
    Teejay - Just a Flash Web-designer

    L4TN.net - Live4theNight, Enjoy your night life!

  3. #3
    Utente di HTML.it L'avatar di r1cky`
    Registrato dal
    Feb 2007
    Messaggi
    432
    Secondo me hai commesso qualche errore nella progettazione di questo database, è per questo che le query ti vengono "strane". Sinceramente a me non è mai capitato di vedere che il nome della tabella da cui prelevare i dati viene estratto da un'altra query...

  4. #4
    Originariamente inviato da r1cky`
    Secondo me hai commesso qualche errore nella progettazione di questo database, è per questo che le query ti vengono "strane". Sinceramente a me non è mai capitato di vedere che il nome della tabella da cui prelevare i dati viene estratto da un'altra query...
    concordo pienamente,se i campi sono uguali in tutte le tabelle ma hanno solo nomi diversi è inutile creare piu tabelle,ti sembrera magari che tabelle troppo grosse riducono performance ma lasciale gestire a mysql ed evita di complicarti la vita con ste cose cosi complesse visto che risparmiando magari sul database seek perdi un bel po di performance su complessita query,connessioni a mysql o su php.

    fai una cosa standard e normalizzata e molto ben studiata(il database è la base del sito,va studiata con molta calma soprattuto se contiene molti dati)e ricorda di non esagerare con cose complesse,io ad esempio sono un maniaco folle della normalizzazione e molte volte sono arrivato a normalizzare praticamente qualunque campo delle tabelle facendo uscire un casino immondo di join :berto: !

  5. #5
    le tabelle, secondo me, potrebberò rimanere più o meno uguali, a parte l'ultima che sicuramente avrà la struttura uguale per i vari tipi ... conviene farne una unica con un campo discriminatore (di tipo enum magari ^^)

    però ci sarebbe da visionare bene la struttura per poterti dare dei consigli più utili ed in ogni caso ci vorrebbe capire esattamente che devi farci

    detto questo, puoi usare le join ^^

  6. #6
    Originariamente inviato da daniele_dll
    le tabelle, secondo me, potrebberò rimanere più o meno uguali, a parte l'ultima che sicuramente avrà la struttura uguale per i vari tipi ... conviene farne una unica con un campo discriminatore (di tipo enum magari ^^)

    però ci sarebbe da visionare bene la struttura per poterti dare dei consigli più utili ed in ogni caso ci vorrebbe capire esattamente che devi farci

    detto questo, puoi usare le join ^^
    prova a studiarti meglio la normalizzazione,se tutte le tabelle hanno campi uguali ma alcune hanno campi in piu basta creare una tabella di appoggio che verra joinata solo e unicamente se i dati sono necessari.

    Ad esempio su degli oggetti una borsa magari non ha la taglia,un paio di scarpe invece si;bastera fare una
    codice:
    SELECT * FROM oggetti JOIN taglia on (oggetti.nome=taglia.nome);
    P.s:dicevo al nostro amico non a te ovviamente

  7. #7
    mmm a volte un'eccessiva normalizzazione potrebbe causare problemi a posteriori

    la normalizzazione va fatta zenit per una data tipologia di progetti, ma per altri progetti, come ad esempio mi sembra questo, non conviene fare una normalizzazione zenit

    per intenderci, meglio tenere qualche tabella in più che ti dia la possiiblità tra un mese di modificare la struttura con facilità senza stravolgere nulla piuttosto che fare la normalizzazione zenit e tra 6 mesi perdere settimane per fare le modifiche necessarie ad aggiungere le feature volute e a ristrutturare il sistema per renderlo di nuovo compatibile con il database modificato

  8. #8
    non ho capito granche' della struttura, ma di una tabella tipi con il nome delle tabelle del database non me la vedo di gran utilita'.

    locali.id_tipo = tipi.id_info che poi indirizza al nome della tabella su cui fare la ricerca

    equivale a mettere in locali.id_tipo direttamente il nome della tabella ed eliminare la tabella tipi. Si presume infatti che non possa esserci lo stesso tipo con due tabelle di riferimento ma potrebbe esserci una tabella di riferimento che risponde a piu' tipologie. Se cosi' fosse sarebbe rispettata la relazione 1 <-> molti e non servirebbe la tabella di unione (la tab tipi).

    Si potrebbe considerare anche che, alla fin della fiera, il nome tabella di riferimento sia un attributo della tabella locali.

    A questo punto serviranno sempre due query. La prima estrarra' il nome della tabella e la seconda utilizzera' il nome_tabella estratto per la propria query.

    Inoltrandosi sempre piu' ... allora perche' non fare un array con indice numerico dove per valore trovi il nome_tabella? Sarebbe ancora piu' pulito.

    Codice PHP:
    $array = array(=> 'ciccio'=> 'pallino'=> 'pallo');

    $id 2;

    $query "select * from $array[$id]"
    ma forse e' troppo semplice e non va bene.

    Naturalmente tutto condito con un bel IMHO!!!

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

  9. #9
    Ciao a tutti, grazie delle risposte e scusate il ritardo, ero impegnatissimo con la tesi di laurea.


    Il progetto è appunto un progetto per la mia tesi di laurea.

    Un sistema molto più ampio del quale il db è sostanzialmente un base di aggiornamento.


    Allora.... le tabelle non hanno gli stessi campi, sono diverse, per questo sono state divise.

    A chi mi ha consigliato le JOIN, il problema è che il db dovrebbe essere aggiornabile tramite un cms, con il quale aggiungere eventuali nuovi tipi, inoltre le tabelle possono contenere informazioni molto differenti...
    Un sistema di JOIN è quindi abbastanza impensabile.

    Il riferimento al nome della tabella non è stato messo direttamente nella tabella locali per una questione di normalizzazione inanzitutto. Inoltre la tabella tipi contiene anche il nome visualizzato del tipo.
    Es. tipo Bar & Pubs con id 3, tabella di riferimento bar.


    Sinceramente la mia non mi pare una progettazione così assurda.
    Teejay - Just a Flash Web-designer

    L4TN.net - Live4theNight, Enjoy your night life!

  10. #10
    Originariamente inviato da teejay

    Sinceramente la mia non mi pare una progettazione così assurda.
    molto soggettivo ma senza argomenti per noi che leggiamo non conoscendo il tuo progetto.

    Di certo che la struttura di un database deve avere connotazioni ben precise per la sua corretta gestione e non lasciata al buon tempo degli "utilizzatori finali". Cioe' un database non puo' essere "flessibile" nel tempo ma strutturato e gestito in modo ben robusto e stabile.

    ad ogni modo, alla tua domanda iniziale si puo' confermare che comunque ti serviranno sempre al minimo due query.

    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.