Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    79

    Script PHP + MySQL da sistemare

    Ciao a tutti,
    rieccomi con un altro problema che coinvolge questa volta php e mysql.

    La situazione e' questa: ho due tabelle:

    TAB1= id,tipo,nato,morto
    TAB2= id,data,nutrito

    La prima contiene l'id della cavia e le date di nascita e morte, la seconda contiene l'id della cavia e l'intero calendario mentre il campo nutrito specifica se abbia mangiato o meno (0 corrisponde a digiuno).

    Le date nei campi "nato" e "morto" non sono sempre corrette e spesso non sono nemmeno indicate, per questo motivo devo utilizzare le date in cui si e' nutrita per correggere gli errori.

    Ho iniziato a scrivere un po' di codice in php che vi riporto qui di seguito:
    Codice PHP:
    <?php>
    $db_server=mysql_connect('localhost','xxx','yyy');
    $db_selected=mysql_select_db('mydb',$db_server);

    // Prima query per ottenere la lista di id
    $first_query=mysql_query('SELECT id FROM mydb.oggetti WHERE `tipo`="cavia"');

    // Trasformo il risultato della query in un array
    $cnt=0;
    while (
    $mydb_cavie mysql_fetch_array($first_queryMYSQL_ASSOC)) {
      
    $cavie[$cnt]=$mydb_cavie;
      
    $cavie_array["{$cavie[$cnt]['ogg_id']}"]=array
            (
              
    "id"=>($cavie[$cnt]['id']),
            );
          
    $cnt++;
        }

    // Per ogni id effettuo un controllo nella seconda tabella
    foreach ($cavie_array as $i => $value) {
      
    $cavia_id=$value["id"];
      
    $lifespan_query=mysql_query("SELECT MIN(data) AS nata, MAX(data) AS morta FROM mydb.nutrizione WHERE nutrizione.id='$cavia_id' AND nutrizione.nutrita !='0'");
      
    $count=0;
      while (
    $mydb_lifespan mysql_fetch_array($lifespan_queryMYSQL_ASSOC)) {
        
    $lifespan[$cnt]=$mydb_lifespan;
        
    $lifespan_array["{$lifespan[$cnt]['ogg_id']}"]=array
            (
              
    "id"=>($cavia_id),
              
    "min"=>($lifespan[$cnt]['validfrom']),
              
    "max"=>($lifespan[$cnt]['validto']),
            );
          
    $count++;
      }
    }

    // Stampo id, data di nascita e di morte
    foreach ($validity_array as $i => $value2) {
      echo 
    "{$value2["id"]}|{$value2["min"]}|{$value2["max"]}+";
    }
    ?>

    Quando lo lancio mysql salta al 100% del processore e non scende piu'.

    Secondo voi il mio e' l'approccio corretto? Cosa sto sbagliando?



    Thanks

  2. #2
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    79
    Nessuna idea?

  3. #3

    Re: Script PHP + MySQL da sistemare

    Originariamente inviato da Haran78
    Le date nei campi "nato" e "morto" non sono sempre corrette e spesso non sono nemmeno indicate, per questo motivo devo utilizzare le date in cui si e' nutrita per correggere gli errori.
    Le date sono evidentemente in formato errato: infatti i campi appositamente dedicati per contenerle sono DATE e DATETIME e tali tipologie di campo non possono essere empty (vuoti) ne essere in un formato non corretto.

    Se non aggiusti bene i due campi indicanti le date le query che desideri fare non è possibile realizzarle.
    http://www.miniscript.it
    Se ti sono stato di aiuto in qualche modo in questo forum iscriviti alla fan page di Miniscript - il mio blog di programmazione web.

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    79
    I campi date sono erroneamente settati come char ed i valori sono inseriti in questo modo: "yyyy-mm-dd" (20110308).
    Sebbene non sia possibile trattarle come date, posso sempre trattarle come numeri.

  5. #5
    Bhè... se dici che alcuni campi non sono settati correttamente o nulli la cosa può dar luogo a risultati "inaspettati"

    Inoltre dovresti fare una query JOIN

    e non le query all'interno del foreach
    http://www.miniscript.it
    Se ti sono stato di aiuto in qualche modo in questo forum iscriviti alla fan page di Miniscript - il mio blog di programmazione web.

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    79
    Nella tabella contentente i pasti non ci sono dati mancanti o errati, e' nella tabella oggetti che mancano le date (date che non considero nelle mie query).

    Non sono sicuro che fare una join sia la soluzione migliore. La tabella con i pasti contiene quasi 2 milioni di righe per questo effettuo un primo passaggio dove prendo la lista degli id delle cavie (circa 1000) e poi id per id verifico i valori di massimo e minimo nei campi delle "date".

    Mi forniresti un esempio o qualche referenza per meglio capire come procedere?


    Grazie

  7. #7
    Utente di HTML.it L'avatar di telegio
    Registrato dal
    Sep 2001
    Messaggi
    2,592
    fare una join è quasi sempre la soluzione migliore..
    tu nella tua modalità fai circa 1000 query.. con la join ne faresti una, sicuramente con più elaborazione (..poi non so quanto..) ma una sola..

    SELECT * FROM TAB1 LEFT JOIN TAB2 on TAB1.id = TAB2.id )

    nella query ci puoi aggiungere il where che ti pare...

  8. #8
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    79
    Ho provato con la join:

    SELECT MIN(data) AS nata, MAX(data) AS morta, MAX(id) as cavia_id FROM mydb.nutrizione LEFT JOIN mydb.oggetti ON (mydb.nutrizione.id=mydb.oggetti.id) WHERE oggetti.tipo='cavia' AND nutrizione.nutrita <> '0';


    Lanciata direttamente sul db mi restituisce un solo risultato e non la lista delle cavie con le relative date di nascita e morte.

  9. #9
    Utente di HTML.it L'avatar di telegio
    Registrato dal
    Sep 2001
    Messaggi
    2,592
    a naso la query è sbagliata..
    min e max danno un risultato solo.. messi nella stessa query ne danno 2..
    probabilmente di quei due risultati che otterresti, uno non passa la clausola where..

    non sono espertissimo di sql purtroppo..
    fai delle prove a partire dalla query join base che ti ho messo.. poi vedi se aggiungendo dei parametri il risultato che hai è attendibile..
    se non riesci fai un dump delle tabelle che vediamo di darti una mano..

  10. #10
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Tanto per cominciare sarei curioso di capire a cosa ti servono tutte le righe della seconda tabella con il campo nutrita a 0. Fossi in te le caccerei nel cesso.

    SELECT MIN(data) AS nata, MAX(data) AS morta, n.id FROM mydb.nutrizione n JOIN mydb.oggetti ON (mydb.nutrizione.id=mydb.oggetti.id) WHERE oggetti.tipo='cavia' AND nutrizione.nutrita <> '0' GROUP BY n.id;

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