Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Optymalizacja zapytania
Largo
post
Post #1





Grupa: Zarejestrowani
Postów: 203
Pomógł: 6
Dołączył: 11.09.2005

Ostrzeżenie: (0%)
-----


Witam,

Czy podane poniżej zapytanie jest poprawne ( nie ja jestem jego autorem, mi się ono nie podoba! ):

  1. UPDATE ibf_members SET fg = IF ( id = 1, fg + 1,fg - 1 ) WHERE id IN ( 1, 2 )


Zapytanie ma aktualizować kwoty ( fg ) - jednej dodawać, drugiej odejmować. Nie wiem po co jest ten IF ( czy istnieje takie ID? ), a IN z kolei rozumiem. Czy to jest optymalne?

Pozdrawiam,
Largo

Ten post edytował Largo 10.04.2009, 20:44:45
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
kilas88
post
Post #2





Grupa: Zarejestrowani
Postów: 305
Pomógł: 25
Dołączył: 27.01.2007

Ostrzeżenie: (0%)
-----


jeśli ten zapis aktualizuje kilka rekordów to wystarczy.

IF (warunek, jeśli warunek jest spełniony, jeśli nie jest spełniony)
Go to the top of the page
+Quote Post
Largo
post
Post #3





Grupa: Zarejestrowani
Postów: 203
Pomógł: 6
Dołączył: 11.09.2005

Ostrzeżenie: (0%)
-----


Cytat(kilas88 @ 10.04.2009, 20:01:54 ) *
jeśli ten zapis aktualizuje kilka rekordów to wystarczy.

IF (warunek, jeśli warunek jest spełniony, jeśli nie jest spełniony)


Witam,

To wg. Twoich słów, nie powinien on odejmować użytkownika wysyłającemu kwoty, tak? Ponieważ podane zapytanie jak widzisz, dodaje i odejmuje. Czyli warunek chyba nie tak idzie :-) Ale zapytanie ogólnie OK? Czy jest optymalne? Da się je bardziej optymalizować czy zostało dobrze stworzone?

Pozdrawiam,
Largo
Go to the top of the page
+Quote Post
kilas88
post
Post #4





Grupa: Zarejestrowani
Postów: 305
Pomógł: 25
Dołączył: 27.01.2007

Ostrzeżenie: (0%)
-----


przede wszystkim powinieneś zastosować właściwsze nazwy tabel i pól, adekwatne do danych, jakie przechowywują.

zapytanie działa następująco: wyszukiwane są rekordy o id 1 i 2 (between byłoby lepsze), w których pole fg zmieniane jest dla id=1 na id=2, a dla id=2 na id=1.

tongue.gif

nie wiem jakie zadanie dokładnie to ma wykonywać, ale nie widzę zbyt wiele logiki w tym zapytaniu.
Go to the top of the page
+Quote Post
Largo
post
Post #5





Grupa: Zarejestrowani
Postów: 203
Pomógł: 6
Dołączył: 11.09.2005

Ostrzeżenie: (0%)
-----


Witaj,

  1. <?php
  2. $this->ipsclass->DB->simple_construct( array( 'update' => 'members',
  3.                                                          'set'    => 'fg=IF(id='.$this->ipsclass->input['to_id'].', fg+'.$this->ipsclass->input['amount'].', fg-'.$this->ipsclass->input['amount'].')',
  4.                                                          'where'  => 'id IN (''.$this->ipsclass->input['to_id'].'','.$this->ipsclass->member['id'].')' ) );
  5.            $this->ipsclass->DB->simple_exec();
  6. ?>


Trochę kodu PHP z kodem IP.Board podam, ale powinieneś łatwiej zrozumieć. Oto logika:

Są 2 osoby. Jedna np. chcę kupić przedmiot ( gra ), i aby tego wykonać musi wysłać FG ( Forum Gold dlatego nazwa FG ), jej musi odjąć od konta i tamtemu ma podać tą kwotę. Chyba do tej pory jasne? :-) Po co to id w IF? I jak działa IN, skoro są 3 parametry?

$this->to_id - ID osoby, do której FG jest przekazywane
$this->ipsclass->member['id'] - moje ID, osoby która aktualnie jest zalogowana i wysłała FG
$this->ipsclass->input['amount'] - kwota

Rozumiesz teraz problem? Nie mówiąc o dupnej składni zapytanie ( $this->ipsclass->DB->do_update ) to na dodatek nie ten typ funkcji :-)

Pozdrawiam,
Largo

Ten post edytował Largo 10.04.2009, 21:25:06
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.08.2025 - 18:50