Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di blekm
    Registrato dal
    Jun 2004
    Messaggi
    8,310

    codice incasinato, come semplificarlo diminuendo il numero di query?

    collegandomi ad un precedente 3d (risolto grazie a filippo.toso ) ho scoperto che per costruire una parte di un gestionale vengono eseguite circa 30 query

    codice php (incasinatissimo)

    Codice PHP:
    function zoneDB($lingua){

        
    $Azone = array("PID" => array(), "PNM" => array(), "CID" => array(), "CNM" => array(), "LID" => array(), "LNM" => array());
        
    $sql '';
        
    $ord '';

        
    $TG "B";

        
    $whe " WHERE tipo='PA' and ass='$TG' and stato>0";
        
    $con xapricon();

        
    $sql "SELECT ID_zona, nome FROM zone";
        
    $ord " order by nome";

        
    $rec2 '';
        
    $rec1 '';
        
    $rec0 xquery($sql.$whe.$ord);

        
    $totrec mysql_num_rows($rec0);
        while(
    $riga0 mysql_fetch_assoc($rec0)){
            
    $whe " WHERE ID_rife='".$riga0['ID_zona']."' and tipo='CG' and ass='$TG' and stato>0";
            
    $rec1 xquery($sql.$whe.$ord);
            
    $totrec mysql_num_rows($rec1);
            if(
    $totrec>0){ 
                while(
    $riga1 mysql_fetch_assoc($rec1)){
                    
    $whe " WHERE ID_rife='".$riga1['ID_zona']."' and tipo='LU' and ass='$TG' and stato>0";
                    
    $rec2 xquery($sql.$whe);
                    
    $totrec mysql_num_rows($rec2);
                    if(
    $totrec>0){ 
                        while(
    $riga2 mysql_fetch_assoc($rec2)){
                            
    array_push($Azone['PID'], $riga0['ID_zona']);
                            
    array_push($Azone['PNM'], $riga0['nome']);
                            
    array_push($Azone['CID'], $riga1['ID_zona']);
                            
    array_push($Azone['CNM'], $riga1['nome']);
                            
    array_push($Azone['LID'], $riga2['ID_zona']);
                            
    array_push($Azone['LNM'], $riga2['nome']);
                        }
                    } else {
                        
    array_push($Azone['PID'], $riga0['ID_zona']);
                        
    array_push($Azone['PNM'], $riga0['nome']);
                        
    array_push($Azone['CID'], $riga1['ID_zona']);
                        
    array_push($Azone['CNM'], $riga1['nome']);
                        
    array_push($Azone['LID'], 0);
                        
    array_push($Azone['LNM'], 0);
                    }
                }
            } else {
                
    array_push($Azone['PID'], $riga0['ID_zona']);
                
    array_push($Azone['PNM'], $riga0['nome']);
                
    array_push($Azone['CID'], 0);
                
    array_push($Azone['CNM'], 0);
                
    array_push($Azone['LID'], 0);
                
    array_push($Azone['LNM'], 0);
            }
        }
        
    $fre xchiudicon($rec0,$con);
        if(!empty(
    $rec1)){
        }
        if(!empty(
    $rec2)){
            
    $fre xchiudicon($rec2,$con);
        }
        return 
    $Azone;

    il risultato di questa operazione è una cosa del genere

    Codice PHP:
    Array
    (
        [
    PID] => Array
            (
                [
    0] => 73
                
    [1] => 73
                
    [2] => 73
                
    [3] => 73
                
    [4] => 72
                
    [5] => 71
                
    [6] => 71
                
    [7] => 71
                
    [8] => 71
                
    [9] => 71
                
    [10] => 71
                
    [11] => 71
                
    [12] => 71
                
    [13] => 71
                
    [14] => 71
                
    [15] => 71
                
    [16] => 71
                
    [17] => 71
                
    [18] => 71
                
    [19] => 70
                
    [20] => 70
                
    [21] => 70
                
    [22] => 35
            
    )

        [
    PNM] => Array
            (
                [
    0] => Categoria A 60 metri
                
    [1] => Categoria A 60 metri
                
    [2] => Categoria A 60 metri
                
    [3] => Categoria A 60 metri
                
    [4] => Categoria B da 40 a 60 mt
                
    [5] => Categoria C da 20 a 40 mt
                
    [6] => Categoria C da 20 a 40 mt
                
    [7] => Categoria C da 20 a 40 mt
                
    [8] => Categoria C da 20 a 40 mt
                
    [9] => Categoria C da 20 a 40 mt
                
    [10] => Categoria C da 20 a 40 mt
                
    [11] => Categoria C da 20 a 40 mt
                
    [12] => Categoria C da 20 a 40 mt
                
    [13] => Categoria C da 20 a 40 mt
                
    [14] => Categoria C da 20 a 40 mt
                
    [15] => Categoria C da 20 a 40 mt
                
    [16] => Categoria C da 20 a 40 mt
                
    [17] => Categoria C da 20 a 40 mt
                
    [18] => Categoria C da 20 a 40 mt
                
    [19] => Categoria D 20 metri
                
    [20] => Categoria D 20 metri
                
    [21] => Categoria D 20 metri
                
    [22] => Italia
            
    )

        [
    CID] => Array
            (
                [
    0] => 74
                
    [1] => 76
                
    [2] => 77
                
    [3] => 113
                
    [4] => 86
                
    [5] => 92
                
    [6] => 89
                
    [7] => 80
                
    [8] => 121
                
    [9] => 121
                
    [10] => 87
                
    [11] => 119
                
    [12] => 91
                
    [13] => 88
                
    [14] => 82
                
    [15] => 81
                
    [16] => 83
                
    [17] => 83
                
    [18] => 105
                
    [19] => 126
                
    [20] => 124
                
    [21] => 90
                
    [22] => 0
            
    )

        [
    CNM] => Array
            (
                [
    0] => Mega yacht
                
    [1] => Mega yacht
                
    [2] => Mega yacht
                
    [3] => Mega yacht
                
    [4] => Benetti
                
    [5] => Azimut
                
    [6] => Canados
                
    [7] => Cerri Cantieri navali
                
    [8] => Dominator
                
    [9] => Dominator
                
    [10] => Ferretti
                
    [11] => Hatteras
                
    [12] => Leopard
                
    [13] => Maiora
                
    [14] => Overmarine
                
    [15] => Pershing
                
    [16] => San Lorenzo
                
    [17] => San Lorenzo
                
    [18] => Tecnomar
                
    [19] => Azimut
                
    [20] => Dominator
                
    [21] => Ferretti
                
    [22] => 0
            
    )

        [
    LID] => Array
            (
                [
    0] => 75
                
    [1] => 93
                
    [2] => 94
                
    [3] => 114
                
    [4] => 102
                
    [5] => 110
                
    [6] => 107
                
    [7] => 96
                
    [8] => 122
                
    [9] => 123
                
    [10] => 103
                
    [11] => 120
                
    [12] => 109
                
    [13] => 104
                
    [14] => 100
                
    [15] => 97
                
    [16] => 101
                
    [17] => 118
                
    [18] => 106
                
    [19] => 127
                
    [20] => 125
                
    [21] => 108
                
    [22] => 0
            
    )

        [
    LNM] => Array
            (
                [
    0] => 18 Cabine
                
    [1] => 18 Cabine
                
    [2] => 18 Cabine
                
    [3] => 18 Cabine
                
    [4] => 6 Cabine
                
    [5] => 4 cabine
                
    [6] => 5 Cabine
                
    [7] => 5 Cabine
                
    [8] => 4 cabine
                
    [9] => 3 Cabine
                
    [10] => 4 cabine
                
    [11] => 4 Cabine
                
    [12] => 3 Cabine
                
    [13] => 3 Cabine
                
    [14] => 5 Cabine
                
    [15] => 4 cabine
                
    [16] => 5 Cabine
                
    [17] => 4 Cabine
                
    [18] => 4 cabine
                
    [19] => 2 Cabine
                
    [20] => 3 Cabine
                
    [21] => 3 Cabine
                
    [22] => 0
            
    )

    ora, siccome questa elaborazione richiede circa 30 query io sto cercando di ottimizzare la costruzione di questo array... sto provando a fare une left join sulla stessa tabella, ma non riesco a venirne a capo.

    questa invece è la sequenza di query che vengono eseguite per costruire quell'array
    codice:
    SELECT ID_zona, nome FROM zone WHERE tipo='PA' and ass='B' and stato>0 order by nome
    SELECT ID_zona, nome FROM zone WHERE ID_rife='73' and tipo='CG' and ass='B' and stato>0 order by nome
    SELECT ID_zona, nome FROM zone WHERE ID_rife='74' and tipo='LU' and ass='B' and stato>0
    SELECT ID_zona, nome FROM zone WHERE ID_rife='76' and tipo='LU' and ass='B' and stato>0
    SELECT ID_zona, nome FROM zone WHERE ID_rife='77' and tipo='LU' and ass='B' and stato>0
    SELECT ID_zona, nome FROM zone WHERE ID_rife='113' and tipo='LU' and ass='B' and stato>0
    SELECT ID_zona, nome FROM zone WHERE ID_rife='72' and tipo='CG' and ass='B' and stato>0 order by nome
    SELECT ID_zona, nome FROM zone WHERE ID_rife='86' and tipo='LU' and ass='B' and stato>0
    SELECT ID_zona, nome FROM zone WHERE ID_rife='71' and tipo='CG' and ass='B' and stato>0 order by nome
    SELECT ID_zona, nome FROM zone WHERE ID_rife='92' and tipo='LU' and ass='B' and stato>0
    SELECT ID_zona, nome FROM zone WHERE ID_rife='89' and tipo='LU' and ass='B' and stato>0
    SELECT ID_zona, nome FROM zone WHERE ID_rife='80' and tipo='LU' and ass='B' and stato>0
    SELECT ID_zona, nome FROM zone WHERE ID_rife='121' and tipo='LU' and ass='B' and stato>0
    SELECT ID_zona, nome FROM zone WHERE ID_rife='87' and tipo='LU' and ass='B' and stato>0
    SELECT ID_zona, nome FROM zone WHERE ID_rife='119' and tipo='LU' and ass='B' and stato>0
    SELECT ID_zona, nome FROM zone WHERE ID_rife='91' and tipo='LU' and ass='B' and stato>0
    SELECT ID_zona, nome FROM zone WHERE ID_rife='88' and tipo='LU' and ass='B' and stato>0
    SELECT ID_zona, nome FROM zone WHERE ID_rife='82' and tipo='LU' and ass='B' and stato>0
    SELECT ID_zona, nome FROM zone WHERE ID_rife='81' and tipo='LU' and ass='B' and stato>0
    SELECT ID_zona, nome FROM zone WHERE ID_rife='83' and tipo='LU' and ass='B' and stato>0
    SELECT ID_zona, nome FROM zone WHERE ID_rife='105' and tipo='LU' and ass='B' and stato>0
    SELECT ID_zona, nome FROM zone WHERE ID_rife='70' and tipo='CG' and ass='B' and stato>0 order by nome
    SELECT ID_zona, nome FROM zone WHERE ID_rife='126' and tipo='LU' and ass='B' and stato>0
    SELECT ID_zona, nome FROM zone WHERE ID_rife='124' and tipo='LU' and ass='B' and stato>0
    SELECT ID_zona, nome FROM zone WHERE ID_rife='90' and tipo='LU' and ass='B' and stato>0
    SELECT ID_zona, nome FROM zone WHERE ID_rife='35' and tipo='CG' and ass='B' and stato>0 order by nome
    SELECT * FROM prodotti WHERE tipo='YA' and stato > 0 order by ordinamento, titolo
    qualche aiutino per costruire quell'array con 1/2 query? Ove fosse possibile, ovviamente..

    posso solo immaginare che sia complesso per voi anche solo capire il codice, se necessario sono disposto a fare altre spiegazioni più dettagliate, basta chiedere

    se qualcuno ha pazienza per mettermi sulla strada giusta
    Il portale sul turismo a Lucca

    Siti web Lucca

    Vendo Tex a colori di Repubblica (primi 100 numeri) - info in pvt.

  2. #2
    Utente di HTML.it L'avatar di blekm
    Registrato dal
    Jun 2004
    Messaggi
    8,310
    l'ultima query del primo post non consideratela, è un log di un altra cosa
    Il portale sul turismo a Lucca

    Siti web Lucca

    Vendo Tex a colori di Repubblica (primi 100 numeri) - info in pvt.

  3. #3
    beh senza sapere quello che vuoi fare e senza sapere la quantità di dati con cui hai a che fare posso buttarla li:

    invece di fare delle query in cicli while innestati (filtrandole a monte) puoi effettuare le 3 query (senza filtro) e poi eseguire i while.

    aumenterai il tempo che php ci mette a gestire il tutto però invece di 30 query (o più) ne avrai sempre 3.

    es:
    codice:
    $query1 = xxx;
    $query2 = xxx;
    $query3 = xxx;
    
    while ( $riga1 = xx )  {
       ...
       while ( $riga2 = yy ) {
          ...
          while ( $riga3 = zz ) {
             ...
             // costruisci il tuo array
             ...
          }
       }
    }
    non è una soluzione migliore anche perchè dipende molto dal numero di dati con cui avrai a che fare e dal tempo di esecuzione della singola query...bisogna valutare se ti conviene più allungare i tempi di php (xkè i while saranno su più dati visto che non ci sono filtri a monte) oppure fare una marea di query
    Administrator of NAMDesign.Net

  4. #4
    Utente di HTML.it L'avatar di blekm
    Registrato dal
    Jun 2004
    Messaggi
    8,310
    Originariamente inviato da LeaderGL
    beh senza sapere quello che vuoi fare e senza sapere la quantità di dati con cui hai a che fare posso buttarla li:
    sono select che vengono create collegate tra loro, stile stato, città, regione

    Originariamente inviato da LeaderGL
    non è una soluzione migliore anche perchè dipende molto dal numero di dati con cui avrai a che fare e dal tempo di esecuzione della singola query...bisogna valutare se ti conviene più allungare i tempi di php (xkè i while saranno su più dati visto che non ci sono filtri a monte) oppure fare una marea di query
    volevo fare meno query perchè l'hosting ha promesso la sospensione dell'account perchè vengono fatte troppe query sul dominio in questione (però la maggior parte di query vengono fatte dal lato pubblico, e questo "bug" l'ho già aggiustato)
    Il portale sul turismo a Lucca

    Siti web Lucca

    Vendo Tex a colori di Repubblica (primi 100 numeri) - info in pvt.

  5. #5
    Utente di HTML.it L'avatar di blekm
    Registrato dal
    Jun 2004
    Messaggi
    8,310
    up
    Il portale sul turismo a Lucca

    Siti web Lucca

    Vendo Tex a colori di Repubblica (primi 100 numeri) - info in pvt.

  6. #6
    Originariamente inviato da blekm
    up
    non si puo' cambiare una struttura come quella che ti sei dato con due suggerimenti.

    Posso identificare qualcosa sulla lista di query. per esempio:

    SELECT ID_zona, nome FROM zone
    WHERE ID_rife='92' and tipo='LU' and ass='B' and stato>0
    order by nome

    l'id_rife si presume univoco. Quindi puo' solo essere di un "tipo", mentre "ass" e "stato" potrebbero avere valori differenti, pero' a te servono (in questo caso) solo quelli con ass = B e stato > 0.

    Potresti cominciare a selezionare (prima) solo quei record con ass = b e stato > 0 ed elimineresti gia' due AND. Se poi il "tipo" a questo punto diventasse indifferente rispetto all'id_rife ma ti servisse solo per un ordinamento, allora potresti usare l'ordinamento..... voglio dire non ha senso se punti ad uno specifico record con una condizione sul "tipo" che non potrebbe essere diverso da quello che e' ... eventualmente seleziona prima gli id che corrispondono al "tipo"..... prima, quando fai la lista degli id.

    Se poi raccogli gli id_rife con un group_concat allora potrai mettere tutti gli id nel where con la funzione IN(). La query (una sola) avendo gia scartato lo stato = 0 e ass diverso da B diventerebbe:

    select ID_zona, nome, tipo
    FROM zone
    where ID_rife IN(73, 74, 78, 123, 456, ecc)
    order by tipo, nome

    ma e' una pura considerazione delle query realizzate e non dello script precedente che genera le 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.