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

Monital

Utente Attivo
15 Apr 2009
778
2
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
 

Monital

Utente Attivo
15 Apr 2009
778
2
18
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
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
 

marino51

Utente Attivo
28 Feb 2013
2.890
157
63
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 ….
 

Monital

Utente Attivo
15 Apr 2009
778
2
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.
 

Monital

Utente Attivo
15 Apr 2009
778
2
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?
 

marino51

Utente Attivo
28 Feb 2013
2.890
157
63
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
 

marino51

Utente Attivo
28 Feb 2013
2.890
157
63
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:

Monital

Utente Attivo
15 Apr 2009
778
2
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.

NON pubblicando in modo trasparente il codice con cui stai lavorando,
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.

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'é
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:

ErrorCREATE: UPDATE mon_apod_stat SET t1.Cognome = t2.name FROM mon_apod_stat t1 INNER JOIN mon_apod_playername t2 ON t1.firstnameid = t2.nameid You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'FROM mon_apod_stat t1 INNER JOIN mon_apod_playername ON t1.firstnameid = t' at line 1
*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

Request Timeout
This request takes too long to process, it is timed out by the server. If it should not be timed out, please contact administrator of this web site to increase 'Connection Timeout'.
però l'update lo ha fatto correttamente, i campi sono tutti pieni con i nomi.

da qui mi aggancio anche

18420 righe sono un nulla per l'update, il "request time" deve stare altrove
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
 

marino51

Utente Attivo
28 Feb 2013
2.890
157
63
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:

Monital

Utente Attivo
15 Apr 2009
778
2
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.
 

Max 1

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
29 Feb 2012
4.197
312
83
@marino51
Per favore non postare codice con delle immagini! Usa gli appositi tag!
Grazie