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

    Query SQL (Struttura giusta?)

    Ciao,

    Sto montando delle query per estrarre dati da più tabelle.
    Vorrei una dritta per sapere se c'è un modo migliore per ottimizzarla, oppure così può andare bene.
    Grazie a tutti.


    Codice PHP:
    //Recupera cliente
        
    $sollecito_cart_id $_REQUEST['sollecito_cart_id'];
        
        
    // Recupera sollecito
        
    $sqlSolletcito mysql_query("SELECT * FROM tbl_sollecito_cart WHERE sollecito_cart_id='$sollecito_cart_id'",$con);
        
    $row mysql_fetch_array($sqlSollecitoMYSQL_BOTH);
            
        
    $sollecito_cart_id $row['sollecito_cart_id'];
        
    $sollecito_cart_cliente_id $row['sollecito_cart_cliente_id'];
        
    $sollecito_cart_utente_id $row['sollecito_cart_utente_id'];
          
        
    // Recupera Cliente
        
    $sqlCliente mysql_query("SELECT * FROM crm_clienti WHERE cliente_id='$sollecito_cart_cliente_id'",$con);
        
    $row mysql_fetch_array($sqlClienteMYSQL_BOTH);
            
        
    $cliente_nome_fantasia $row['cliente_nome_fantasia'];
        
    $cliente_indirizzo $row['cliente_indirizzo'];

        
    // Recupera Utente
        
    $sqlUtente mysql_query("SELECT * FROM ged_utenti WHERE utente_id='$sollecito_cart_usuario_id'",$con);
        
    $row mysql_fetch_array($sqlUtenteMYSQL_BOTH);

        
    $utente_nome $row['utente_nome'];
        
    $utente_dipartimento_id $row['utente_dipartimento_id'];
        
        
    // Recupera Dipartimento
        
    $sqlDipartimento mysql_query("SELECT * FROM tab_dipartimenti WHERE dipartimento_id='$utente_dipartimento_id'",$con);
        
    $row mysql_fetch_array($sqlDipartimentoMYSQL_BOTH);

        
    $dipartimento_nome $row['dipartimento_nome']; 

  2. #2
    Originariamente inviato da raven74
    fai un'unica SELECT e usi i left join

    SELECT * FROM tbl_sollecito_cart
    LEFT JOIN crm_clienti ON cliente_id = sollecito_cart_cliente_id
    LEFT JOIN ged_utenti WHERE utente_id = sollecito_cart_usuario_id
    LEFT JOIN tab_dipartimenti WHERE dipartimento_id = utente_dipartimento_id
    WHERE sollecito_cart_id='$sollecito_cart_id'


    dovrebbe andare

    PS
    ma la variabile $sollecito_cart_usuario_id dove la definisci?
    Nel frattempo ci avevo pensato alle join come via d'uscita, con una query sola fai tutto il lavoro. Rifinirò il codice non appena finito di svilupparlo.

    La variabile la prendo dall'url "index.php?sollecito_cart_id=1"

    Grazie per il consiglio.

  3. #3
    ciao,

    per le query, ed in generale il mondo database, c'è un apposita sezione.

    Visto il discorso iniziato lascio il thread qui, ma maggiore attenzione pls
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  4. #4
    Originariamente inviato da cris.calleo
    Nel frattempo ci avevo pensato alle join come via d'uscita, con una query sola fai tutto il lavoro. Rifinirò il codice non appena finito di svilupparlo.
    Visto che parli di ottimizzazione, allora ti consiglio di evitare anche il SELECT *.
    Di tecniche di ottimizzazione ce ne sono parecchie: il JOIN è solo un metodo per evitare di fare più query.
    <ALCIO />
    Per cortesia: no PVT Tecnici
    ******* LINKS *******
    SRL
    MetalWave

  5. #5
    OK Daniele, provvederò a utilizzare la sezione corretta.

    Alcio, quello che vuoi dire é utilizzare delle tabelle di transizione?

    Per esempio, hai una tabella con 10mila records e alcuni di essi devono essere validati.
    Se fai un select* la query ti legge tutti i records e cattura solo quelli che non sono stati ancora validati.

    Si potrebbe quindi inviare alla tabella records il nuovo registro e contemporaneamente scrivere su di un altra tabella (VALIDARE) il riferimento alla tabella principale con il record da validare appunto. Così la querý é più leggera.

    TBL RECORD
    1 --- Pippo --- Validato
    2 --- Paolo --- Non Validato
    3 --- Carlo --- Non Validato

    TBL VALIDARE
    1 --- 2
    2 --- 3

    Giusto?

  6. #6
    Originariamente inviato da cris.calleo
    Alcio, quello che vuoi dire é utilizzare delle tabelle di transizione?
    No: volevo dire che se usi il SELECT * obblighi il sistema a leggere tutti i record di tutte le colonne, quando spessissimo non serve!
    Se parli di prestazioni, metti nella select solo le colonne di cui realmente necessiti.

    <ALCIO />
    Per cortesia: no PVT Tecnici
    ******* LINKS *******
    SRL
    MetalWave

  7. #7
    p.s. non ho capito cosa intendi con:
    Per esempio, hai una tabella con 10mila records e alcuni di essi devono essere validati.
    Se fai un select* la query ti legge tutti i records e cattura solo quelli che non sono stati ancora validati.
    <ALCIO />
    Per cortesia: no PVT Tecnici
    ******* LINKS *******
    SRL
    MetalWave

  8. #8
    Ahhh, adesso ho capito. Grazie tante per la dritta importantissima.

  9. #9
    Originariamente inviato da alcio74
    p.s. non ho capito cosa intendi con:

    Ho una tabella UTENTI con 10mila records.
    L'utente dev'essere abilitato per poter fare il login.

    Per sapere quali utenti NON sono ancora abilitati ferei la query:
    SELECT * from tbl_utenti WHERE abilitato = 'No'

    (con la tua dritta modificherò a dovere)

    Ogni qualvolta lancio la query, devo leggere 10mila records.

    Se invece creo una tabella tbl_utenti_pendente_validazione con un foreign che mi relaziona l'utente pendente di valdazione, evito di leggere leggere 10mila records:


    UTENTI
    ID----NOME---VALIDO
    1---Pippo---SI
    2---Mario---NO
    3---Paolo---SI


    UTENTI_PENDENTE_VALIDAZIONE
    ID---FOREIGNUTENTI
    1---2

    Per cui potrei estrarre un report di utenti non validati dalla 2nda tabella, e poi con una JOIN recuperare il nome.

    Spero di essermi spiegato.

  10. #10
    ...eppure ne ho viste tante!

    Forse è meglio che posti le tabelle coinvolte e la loro struttura e spieghi bene ciò che devi fare perchè a me sembra una banalissima query!
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

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 © 2026 vBulletin Solutions, Inc. All rights reserved.