Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Update tabele sam podacima iz druge tabele

[es] :: MySQL :: Update tabele sam podacima iz druge tabele

[ Pregleda: 2622 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

svepomalo

Član broj: 306404
Poruke: 196



+21 Profil

icon Update tabele sam podacima iz druge tabele15.09.2014. u 11:14 - pre 116 meseci
Pozdrav,

Dakle imam tabele:

Users (id, first_name, last_name, country)
Names (frist_name, last_name, country)
User_details(id, user_id, end_time)

Ono sto ja hocu je da tabelu users i kolone first_name, last_name i country updatejtujem random vrednostima iz tabele Names ali samo za one usere kojima vreme nije isteklo.
Znaci nesto ovako (verovatno sam lupio ovaj upit)
Code (sql):

     UPDATE
          Users
               SET
                    Users.first_name = Names.first_name,  
                    Users.last_name = Names.last_name,  
                    Users.country = Names.country,
                    User_details.end_time = " . (time() + 10800) . "
               FROM
                    Names
               JOIN
                    Users .id = User_details.user_id
               WHERE
                       User_details.end_time < " . time() . "
               ORDER BY RAND()
 


samo da napomenem da tabele Users i Names nisu na koji nacin povezane, dok su tabele Users i User_details povezane.
Tabela names ima samo vrednost last_name, first_name i country.
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.dynamic.sbb.rs.

Sajt: mysql.rs


+2377 Profil

icon Re: Update tabele sam podacima iz druge tabele15.09.2014. u 11:45 - pre 116 meseci
da si dao neke dummy podatke pa da probamo ali ovako iz glave

Code (sql):

SELECT @c:=COUNT(*) FROM names;
UPDATE users, user_details
SET
   users.first_name = (SELECT first_name FROM names LIMIT @r:=rand() * @c, 1),
   users.last_name = (SELECT last_name FROM names LIMIT @r, 1)
WHERE users.id = user_details.id AND user_details.end_time < now();
 



 
Odgovor na temu

svepomalo

Član broj: 306404
Poruke: 196



+21 Profil

icon Re: Update tabele sam podacima iz druge tabele15.09.2014. u 11:59 - pre 116 meseci
Hvala Bogdane.
Mislim da je to to, sada cu da probam.

Jel moze malo pojasnjenje ovoga:
SELECT @c:=COUNT(*) FROM names;
ovo @c je promenljiva?
I ako je promenljiva koliki je njen vek trajanja s obzorim da se vec u narednom upitu ista ta promenjiva pojavljuje?
a ovo:
users.first_name = (SELECT first_name FROM names LIMIT @r:=rand() * @c, 1),
users.last_name = (SELECT last_name FROM names LIMIT @r, 1)
znaci uhvati first_name random limit 1 i tu si mu dodelio @r promenljivu ali kako zna on da za last_name uhvati bas taj row gde je gore uhvatio first_name?

Verujem da bi i za country onda bilo:
users.country= (SELECT country FROM names LIMIT @r, 1)

Koliko je ovo brzo?

 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.dynamic.sbb.rs.

Sajt: mysql.rs


+2377 Profil

icon Re: Update tabele sam podacima iz druge tabele15.09.2014. u 12:05 - pre 116 meseci
Citat:
svepomalo
SELECT @c:=COUNT(*) FROM names;
ovo @c je promenljiva?

da


Citat:
svepomalo:
koliki je njen vek trajanja s obzorim da se vec u narednom upitu ista ta promenjiva pojavljuje?


dok traje sesija
u sledecem upitu joj promenis vrednost ili iskoristis da je procitas .. u drugoj sesiji mozes da imas istu nisu povezane

Citat:
svepomalo:
users.first_name = (SELECT first_name FROM names LIMIT @r:=rand() * @c, 1),
users.last_name = (SELECT last_name FROM names LIMIT @r, 1)
znaci uhvati first_name random limit 1 i tu si mu dodelio @r promenljivu ali kako zna on da za last_name uhvati bas taj row gde je gore uhvatio first_name?

pa prvo radi onaj prvi set (first_name) i tu dodeli vrednost u @r, onda radi set u last_name i tu procita vrednost iz @r (koju je malopre dodelio)

Citat:
svepomalo:
Verujem da bi i za country onda bilo:
users.country= (SELECT country FROM names LIMIT @r, 1)

da

Citat:
svepomalo:
Koliko je ovo brzo?


pa da je brzo nije, za svaki update imas *3 selectova dodatno, ne moze da bude extra brzo nikako, no kapiram da ovako neku kontrapciju izvrsavas jednom mesecno ili jednom godisnje, sigurno je ne radis svaki dan .. ili svaki sat ...



 
Odgovor na temu

svepomalo

Član broj: 306404
Poruke: 196



+21 Profil

icon Re: Update tabele sam podacima iz druge tabele15.09.2014. u 12:10 - pre 116 meseci
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '@r:=rand() * @c, 1),
users.last_name = (SELECT last_name FROM names ' at line 4
Dobih ovaj error.
 
Odgovor na temu

svepomalo

Član broj: 306404
Poruke: 196



+21 Profil

icon Re: Update tabele sam podacima iz druge tabele15.09.2014. u 12:15 - pre 116 meseci
Hvala jos jednom na objasnjenju.
Sto se tice brzine, jel postoji neki brzi nacin za ovo sto mi treba?
Verujem da sto je veci broj usera koji zadovoljavaju uslov ser_details.end_time < now(); to ce ici sporije, ali ako pricamo npr. oko 10k na svakih sat vremena?
Ne verujem da ce biti toliko ali ajde da uzmemo da je to worst case.
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.dynamic.sbb.rs.

Sajt: mysql.rs


+2377 Profil

icon Re: Update tabele sam podacima iz druge tabele15.09.2014. u 12:37 - pre 116 meseci
jbg ne mozes da turis expression u limit .. retardirani limit koji sam mislio da je otklonjen ali nije :(
moraces da radis stored proceduru za to, ima da bude jos sporije

Citat:
svepomalo
Sto se tice brzine, jel postoji neki brzi nacin za ovo sto mi treba?


pa vidi, moras da razmislis sta uopste radis posto ovo sto radis nema mnogo smisla
 
Odgovor na temu

svepomalo

Član broj: 306404
Poruke: 196



+21 Profil

icon Re: Update tabele sam podacima iz druge tabele15.09.2014. u 14:00 - pre 116 meseci
Mozda sam ja samo paranoican, ali radim na projektu i imam potpisan NDA :)
Upravo je ovo sto meni treba samo sam izmislio ove tabele ali je preslikano ono sto meni treba :)
Nadam se da me razumes :)

Posto ce stored procedura da bude sporija ostaje mi da ovo odradim preko php-a.
Dakle jedan upit da pohvatam usere koji su istekli pa onda da uhvatim random last_name, first_name i country iz tabele names za taj br usera i kroz petlju da protrcim kroz usere i da u vakoj iteraciji uradim update za tog user-a.

Nista mi drugo ne pada na pamet, samo nisam siguran koliko ce ovo brzo ici i da li ce biti brze od stored procedure.
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.dynamic.sbb.rs.

Sajt: mysql.rs


+2377 Profil

icon Re: Update tabele sam podacima iz druge tabele15.09.2014. u 14:18 - pre 116 meseci
Citat:
svepomalo: Mozda sam ja samo paranoican, ali radim na projektu i imam potpisan NDA :)
Upravo je ovo sto meni treba samo sam izmislio ove tabele ali je preslikano ono sto meni treba :)
Nadam se da me razumes :)


eh ima li ko da ne razume :D

Citat:
svepomalo:
Posto ce stored procedura da bude sporija ostaje mi da ovo odradim preko php-a.


stored procedura ce biti mnogo brza od php-a

Citat:
svepomalo:
Dakle jedan upit da pohvatam usere koji su istekli pa onda da uhvatim random last_name, first_name i country iz tabele names za taj br usera i kroz petlju da protrcim kroz usere i da u vakoj iteraciji uradim update za tog user-a.

Nista mi drugo ne pada na pamet, samo nisam siguran koliko ce ovo brzo ici i da li ce biti brze od stored procedure.


isto to uradis samo kroz stored proceduru, mnogo brze nego kroz php

da stanem sad malo u odbranu mysql-a (iako je potpuno idiotski to sto jos uvek ima ta limitacija ali .. jbg .. sta da se radi) to sto ti radis je uglavnom u domenu "prevare" .. sve sto ima veze sa rand() je realno uvek sporo posto ne postoji nacin da optimizer zna sta da radi ...

da ja moram to da odradim ja bi uradio sledece

1. napravio bi tabelu "names" da ima 4-5 puta vise slogova (znaci svaki slog se ponavlja 4-5 puta) i inicijalno bi randomizovao njen sadrzaj
2. uradim count() za koliko ima tih koje mora da prebudzis @C
3. izmerim koliko ima ukupno u names kao @T
4. preracunam neki @X da bude @T - C
5. napunim temp tabelu (create temporary table names_temp like names;) sa novim imenima (insert into names_temp select * from names limit @T,@C)
- ovaj insert moras da napravis kao prepare_statement(concat('insert into names_temp select * from names limit ',@T,',',@C)) pa onda uradis execute tog prepare-a i onda unprepare
6. onda uradis update tvoje tabele tako sto radis join sa temp tabelom
7. dropnes temp tabelu


 
Odgovor na temu

svepomalo

Član broj: 306404
Poruke: 196



+21 Profil

icon Re: Update tabele sam podacima iz druge tabele15.09.2014. u 15:55 - pre 116 meseci
Ok, probacu sa ovim postupkom.

Inace u medjuvremenu sam na brzinu odradio preko php-a i za 780 update-a na mom drljavom laptopu i wamp-u odradio je ovo za 2.1s

Rekao bih da je skroz prihvaltjivo imajuci u obzir da cu imati max 10k, a na svakih sat vremena da portrci kroz sve ovo i nije lose ili mozda gresim? :)

Inace zaboravio sam da imam jos jedan update-a tabele user_details gde menjam vreme.
 
Odgovor na temu

[es] :: MySQL :: Update tabele sam podacima iz druge tabele

[ Pregleda: 2622 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.