[PHP] query update e select insieme ma frazionando l'arrray

Discussione in 'PHP' iniziata da Monital, 30 Novembre 2018.

  1. Monital

    Monital Utente Attivo

    Registrato:
    15 Aprile 2009
    Messaggi:
    777
    Mi Piace Ricevuti:
    2
    Punteggio:
    18
    Salve a tutti, non ho idea di come e se si possa fare una cosa, ho questa query che funziona egregiamente
    PHP:
        $q="UPDATE tabella 1 SET     Cognome        = (SELECT name FROM tabella 2 WHERE nameid = primoid),  Nome = (SELECT name FROM tabella2 WHERE nameid = secondo),Soprannome     = (SELECT name FROM tabella2 WHERE nameid = sopraid)";
    $db->query($q);
    in pratica modifica i campi nome cognome e soprannome della tabella 1 in base all'id che prende dalla tabella 2.

    la query funziona molto bene su piccole mole di dati. Ora però devo affrontare circa 18.000 righe che devo conrontare gli id prelevarlie d upparli e va in crash il server. In un altra cosa che doveva fare ho diciso il tutto in 10 step ma su qyesta query così articolata non so come farlo, ossia non so come inserire la porzione di dati.

    ad esempio su una altra query
    PHP:
    $n=count($array);
    $part=10;//totale da dividere
    $num=1//prima porzione
    $par=floor((($n/$num)*$parts))
    quindi $par inseirto nel cicolo for facevo partire la query ma in questo caso?

    Ho provato ad usare il LIMIT ma a quanto letto sulla guida l'intervallo LIMIT 10,1000 non viene permesso sull'update
     
  2. marino51

    marino51 Utente Attivo

    Registrato:
    28 Febbraio 2013
    Messaggi:
    2.518
    Mi Piace Ricevuti:
    123
    Punteggio:
    63
    Occupazione:
    free lance
    Località:
    Lombardia
    per favore rivedi e riposta la query, correggendo gli errori di scrittura ma soprattutto i nomi dei campi
    altrimenti diventa difficile proporre una soluzione attinente
     
  3. Monital

    Monital Utente Attivo

    Registrato:
    15 Aprile 2009
    Messaggi:
    777
    Mi Piace Ricevuti:
    2
    Punteggio:
    18
    Cosa è che non ti è chiaro?



    la query non ha errori di scrittura ed è impostata esattamente così,l'ho copincollata dal mio script. altrimenti non funzionerebbe ed invece funziona.
    Fai l'update della tabella 1 al campo cognome(seleziona dal campo nome della tabella due dove il campo idname è uguale al campo primo id etc etc.

    los cript va in timeout e non riempe dtutta la tabella perchè la mole dei dati da confrontare è grandicella indi voelvo dividerla in più spezzoni da 1 a 100 da 101 a 200 etc.

    cmq il LIMIT su un intervallo non si può fare con l'update come da manuale php, perciò troverò una soliuzione alternativa
     
  4. marino51

    marino51 Utente Attivo

    Registrato:
    28 Febbraio 2013
    Messaggi:
    2.518
    Mi Piace Ricevuti:
    123
    Punteggio:
    63
    Occupazione:
    free lance
    Località:
    Lombardia
    quel che capisco é che potresti aggiornare un campo per volta con tre update successivi,
    la prima volta per il cognome
    la seconda volta per il nome
    ed infine per il soprannome

    se avessi ancora problemi puoi parzializzare le stesse query inserendo la clausola
    where id between 1 and 10000
    where id between 10000 and 20000
    ovviamente id é riferito alla tabella1

    soluzione "obbrobrio" ma non é dato conoscere altro ….
     
  5. Monital

    Monital Utente Attivo

    Registrato:
    15 Aprile 2009
    Messaggi:
    777
    Mi Piace Ricevuti:
    2
    Punteggio:
    18
    stavo già provando con tutte e due le opzioni ma non ce la fa , ho provato anche a creare un array multidimensionale ma nisba. impressionante che mi sono bloccato così.

    per farla breve ho nel data baste una tabella2
    ID----NAME
    ad ogni id è associato un nome
    1--Antonio
    2-gianluca

    etc..

    nell'altra tabella (tabella1) i vari id con varie colonne tra cui surname name e commonname ogni colonna ha un id io devo creare un update o un altra tabella dove ad ogni id della tabella 2 mi trovi nome cognome

    il problema è che nalla tabella dei nomi ci sono 29500 righenella tabella dei dati ce ne sono 18420.na bella mole di dati e non riescoa tirar fuori sti benedetti nomi. a visualizzare per ogni singolo nome non 'è problema con una join ma se voglio farli in blocco come la giro e la volto il server cede.DAMN.
     
  6. Monital

    Monital Utente Attivo

    Registrato:
    15 Aprile 2009
    Messaggi:
    777
    Mi Piace Ricevuti:
    2
    Punteggio:
    18
    OPS, ho notato una cosa...avevo fatto cosi
    PHP:
    $query="SELECT * FROM tabella1";
    $result=$db->query($query);
    while(
    $lin $result->fetch_array(MYSQLI_ASSOC)){
        
    $nomi[$lin['nameid']] = $lin['name'];
    }                                   
    foreach(
    $nomi as $key=>$value){
        
    $q="UPDATE  tabella 2  SET Cognome='".$value."' WHERE surnameid='".$key."' ";
    $db->query($q);
    }    
    Lanciato lo script dopo un pò la pagina è andata in request time bla bla, però controllando ora nel database ha reimpito tutte le 18420 righe della seconda. ma è normale come cosa?
     
  7. marino51

    marino51 Utente Attivo

    Registrato:
    28 Febbraio 2013
    Messaggi:
    2.518
    Mi Piace Ricevuti:
    123
    Punteggio:
    63
    Occupazione:
    free lance
    Località:
    Lombardia
    hai uno strano modo di chiedere supporto al forum, NON pubblicando in modo trasparente il codice con cui stai lavorando,
    il codice del tuo ultimo post non é coerente con il codice del primo post, nel senso che non fanno la stessa cosa

    nel codice del tuo ultimo post continua ad esserci lo spazio tra "tabella" e "2" , o sei fortunato o non funziona
    l'id é numerico non dovrebbero esserci gli apici, ma tant'é

    18420 righe sono un nulla per l'update, il "request time" deve stare altrove
     
  8. marino51

    marino51 Utente Attivo

    Registrato:
    28 Febbraio 2013
    Messaggi:
    2.518
    Mi Piace Ricevuti:
    123
    Punteggio:
    63
    Occupazione:
    free lance
    Località:
    Lombardia
    in ogni caso while e foreach sono inutili scrivendo la query di update correttamente,
    Codice:
    $query="
    UPDATE tabella1
    SET t1.Cognome = t2.name
    FROM tabella1 t1
    INNER JOIN tabella2 t2 ON t1.surnameid = t2.nameid
    ";
    $result=$db->query($query);
    $result dovrebbe contenere il numero dei record modificati

    l'update potrebbe essere inutile creando una vista (view) che accomuni i valori delle due tabelle e facendo la select sulla tabella "view"
     
    Ultima modifica: 2 Dicembre 2018
  9. Monital

    Monital Utente Attivo

    Registrato:
    15 Aprile 2009
    Messaggi:
    777
    Mi Piace Ricevuti:
    2
    Punteggio:
    18
    Senza vena polemica, sono 9 anni che sonor egistratoe che chiedo aiuto nel forum, perchè non sono nato programmatore ma mi ci diletto per passione, ed onestamente se scorri le mie discussioni sono passato da pippo topolino e clarabella a tizio franco e sempronio senza che nessuno degli utenti che mi hanno aiutato si sia mai posto il problema.

    che la tabella si chiami tabella1 o hdauhidahdiahdiah cosa cambia, perchè dovrei nasconderla per evitare di far confusione ho sempre usato tabella1 e tabella2 o pippo topolino quando ricopio gli script.

    qua aldilà della bravura nella programmazione mi stai dando dello scemo, ho scritto che lo script funziona, se funziona mi pare ovvio che magari invece di tabella(spazio)2 mi trovo la tabella giusta sennò perchè avrei mai dovuto dire che funziona?

    fatta sta premessa ho inserito la query da te suggerita e questo è il risultato:

    *come puoi vedereti ho messo anche il nome che uso io come tabelle che sicuramente cambia il succo del discorso.

    come da errore ho scartabellato un pò ed ho trovato la sintassi corretta

    https://www.mrwebmaster.it/sql/update-simultaneo-due-tabelle_7131.html

    provato e l'update lo fa su tutte le 18420 righe delle tabelle ma dopo qualche secondo mi restituisce sempre

    però l'update lo ha fatto correttamente, i campi sono tutti pieni con i nomi.

    da qui mi aggancio anche

    come già detto non c'è nient'altro sulla pagina sto lavorando su un file di pèrova vuoto

    PHP:
    <?php
    ini_set
    ('memory_limit''2018M'); // 64, 128, 256, 512, 1024, 2018
    ini_set('display_errors'1);
    ini_set('display_startup_errors'1);
    include(
    "define.php");

            
    $sql="ALTER TABLE mon_apod_stat ADD COLUMN Cognome VARCHAR(255);";
            
    $db_amon->query($sql);
            
    $sql1="ALTER TABLE mon_apod_stat ADD COLUMN Nome VARCHAR(255);";
            
    $db_amon->query($sql1);
            
    $sql2="ALTER TABLE mon_apod_stat ADD COLUMN Soprannome VARCHAR(255);";
            
    $db_amon->query($sql2);
                                        
    $query="UPDATE mon_apod_stat as t1 INNER JOIN mon_apod_playername as t2 ON t1.firstnameid = t2.nameid SET t1.Cognome = t2.name "  ;
    $result=$db_amon->query($query);
            (!
    $db_amon->query($query))  ? $error=printf("ErrorCREATE: ".$query."%s\n"$db_amon->error) : $error="tutto ok";

    ?>
    queste sono le uniche righe presenti nel file. e tanto per precisare il file define non è altro che il file di connessione al DB
     
  10. marino51

    marino51 Utente Attivo

    Registrato:
    28 Febbraio 2013
    Messaggi:
    2.518
    Mi Piace Ricevuti:
    123
    Punteggio:
    63
    Occupazione:
    free lance
    Località:
    Lombardia
    altrettanto senza vena polemica,
    se anziché riscrivere una query inserendo degli errori,
    risparmi tempo e fai un copia incolla del codice che stai usando, tutti capiamo meglio,

    per quanto riguarda la query che ti ho passato, non presenta errori di sintassi, mi indica giustamente che manca la tabella, non avendola definita nel mio database
    upload_2018-12-2_18-14-1.png
    viceversa con la query che hai postato nello script precedente, ottengo un errore di sintassi
    upload_2018-12-2_18-15-31.png
    stiamo usando due database diversi, non compatibili al 100% nella sintassi

    rimane il fatto che la logica é giusta ed hai solo dovuto aggiustare la sintassi per adattarla al database che stai usando

    nel tuo ultimo script ci sono anche 3 "ALTER TABLE", di cui non hai mai parlato, che possono richiedere tempo,

    poi esegui 2 volte la query spendendo tempo inutile
    $result=$db_amon->query($query);
    (!$db_amon->query($query)) ? $error...…..
    forse potresti controllare $result

    tutte questo tempo potrebbe portare ad esaurire il tempo "standard"
    potrebbe essere che la prima query faccia il suo lavoro, la seconda volta termini per "difetto di tempo"

    anche a me piace molto imparare é il sale della mia vita e mi guardo bene dall'offendere le persone
    ma io non sono davanti allo schermo del tuo pc e se per te é tutto chiaro ciò che stai facendo, per me é tutto buio
    quindi aiuta chi ti vuole aiutare ….

    da buon ultimo, potresti inserire delle istruzioni tipo
    error_log("alter table 1", 0);
    variando di volta in volta il testo, in modo da leggere nel log di php, cosa sta facendo il tuo script
     
    Ultima modifica: 2 Dicembre 2018
  11. Monital

    Monital Utente Attivo

    Registrato:
    15 Aprile 2009
    Messaggi:
    777
    Mi Piace Ricevuti:
    2
    Punteggio:
    18
    Gli alter table li ho inseriti ora per rifare una prova completa. Prima ho creato i campi poi ho tolto quelle istruzioni. E la ricerca d errore era commentato prima. Ho ridotto tutta a quella query. Mi è venuto il dubbio che forse possa dipendere da alcuni nomi hanno caratteri strani tipo la L polacca o la u tedesca.
     
  12. Max 1

    Max 1 Super Moderatore Membro dello Staff SUPER MOD MOD

    Registrato:
    29 Febbraio 2012
    Messaggi:
    3.802
    Mi Piace Ricevuti:
    283
    Punteggio:
    83
    Sesso:
    Maschio
    @marino51
    Per favore non postare codice con delle immagini! Usa gli appositi tag!
    Grazie
     
  13. marino51

    marino51 Utente Attivo

    Registrato:
    28 Febbraio 2013
    Messaggi:
    2.518
    Mi Piace Ricevuti:
    123
    Punteggio:
    63
    Occupazione:
    free lance
    Località:
    Lombardia
    Max, sono le immagini che provano il risultato ottenuto con quel codice,
    il codice é stato postato correttamente nei post precedenti
     
Sto caricando...
Discussioni simili - [PHP] query update
  1. Max61
    Risposte:
    3
    Visite:
    231
  2. Max61
    Risposte:
    13
    Visite:
    277
  3. sal88
    Risposte:
    2
    Visite:
    149
  4. Tommy03
    Risposte:
    3
    Visite:
    163
  5. Punix
    Risposte:
    1
    Visite:
    159

Condividi questa Pagina