Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Statystyki transakcji
Largo
post 4.11.2009, 11:59:54
Post #1





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

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


Witam,

Dziś nastał mnie wyjątkowo prosty problem, możliwe, że lekkie zaćmienie umysłu. Mam stworzyć statystyki transakcji. Ile użytkownik wykonał transakcji, ile wysłał i ile otrzymał. Stworzyłem to, ale w 3 zapytaniach, co jest wg. mnie zupełnie nieoptymalne. Czy da się to inaczej obejść? Chciałbym zamknąć to w jednym zapytaniu, jeżeli to w ogóle możliwe.

Pozdrawiam,
Largo
Go to the top of the page
+Quote Post
vokiel
post 4.11.2009, 13:52:19
Post #2





Grupa: Zarejestrowani
Postów: 2 592
Pomógł: 445
Dołączył: 12.03.2007

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


Pokaż co masz, to spróbujemy zoptymalizować...


--------------------
Go to the top of the page
+Quote Post
Largo
post 6.11.2009, 09:53:23
Post #3





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

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


  1. /* Get transactions! */
  2. $transactions = $this->DB->buildAndFetch( array( 'select' => 'COUNT(*) AS transactions',
  3. 'from' => 'fg_transactions',
  4. 'where' => 'sender_id='.$uid.' OR recipient_id='.$uid ) );
  5.  
  6. /* Get differences! */
  7. $minus = $this->DB->buildAndFetch( array( 'select' => 'SUM( amount ) AS minus',
  8. 'from' => 'fg_transactions',
  9. 'where' => 'sender_id='.$uid.' OR type = 1' ) );
  10.  
  11. $plus = $this->DB->buildAndFetch( array( 'select' => 'SUM( amount ) AS plus',
  12. 'from' => 'fg_transactions',
  13. 'where' => 'recipient_id='.$uid.' OR type = 1' ) );


Jakieś nowości? Da się z tym coś zrobić?
Go to the top of the page
+Quote Post
vokiel
post 6.11.2009, 11:35:23
Post #4





Grupa: Zarejestrowani
Postów: 2 592
Pomógł: 445
Dołączył: 12.03.2007

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


Twoje zapytania to:
  1. SELECT COUNT(*) AS 'transactions' FROM `fg_transactions` WHERE `sender_id`=$uid OR `recipient_id`=$uid;
  2. SELECT SUM( `amount` ) AS 'minus' FROM `fg_transactions` WHERE `sender_id`=$uid OR type = 1;
  3. SELECT SUM( `amount` ) AS 'plus' FROM `fg_transactions` WHERE `recipient_id`=$uid OR type = 1;


Niestety masz różne warunki, dla różnych pól, zatem w jednym zapytaniu tego łatwo nie będzie. Zastanawiają mnie 2 ostatnie zapytania...

Możesz spróbować z UNION
  1. SELECT COUNT(*) AS 'transactions' FROM `fg_transactions` WHERE `sender_id`=$uid OR `recipient_id`=$uid;
  2. UNION SELECT SUM( `amount` ) AS 'minus' FROM `fg_transactions` WHERE `sender_id`=$uid OR type = 1;
  3. UNION SELECT SUM( `amount` ) AS 'plus' FROM `fg_transactions` WHERE `recipient_id`=$uid OR type = 1;


Lub z podzapytaniami
  1. SELECT
  2. COUNT(*) AS 'transactions'
  3. (SELECT SUM( `amount` ) FROM `fg_transactions` WHERE `sender_id`=$uid OR type = 1) AS 'minus',
  4. (SELECT SUM( `amount` ) FROM `fg_transactions` WHERE `recipient_id`=$uid OR type = 1) AS 'plus'
  5. FROM `fg_transactions` WHERE `sender_id`=$uid OR `recipient_id`=$uid;



--------------------
Go to the top of the page
+Quote Post
Largo
post 7.11.2009, 13:49:44
Post #5





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

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


Witaj,

Ostatnie rozwiązanie pomogło! Z logicznego punktu widzenia optymalizacji jako takiej nie ma, bo silnik pokazuje, że zapytań jest o 2 mniej, ale są one wykonywane defacto w jednym. A czemu warunki takie muszą być?

Podliczam ilość wszystkich transakcji gdzie brałem udział, a mogę być zarówno wysyłającym jak i odbiorcą, a ostatnie dwa to obliczenia ile wysłałem i ile odebrałem, biorąc pod uwagę transakcje systemowe.

Pozdrawiam,
Largo
Go to the top of the page
+Quote Post
maly_swd
post 7.11.2009, 14:01:13
Post #6





Grupa: Zarejestrowani
Postów: 744
Pomógł: 118
Dołączył: 14.02.2009
Skąd: poziome

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


a ten warunej jest dobry?
WHERE `recipient_id`=$uid OR type = 1;

podaj wszystko co odebral uzytkownik o ID=5 lub podaj wszystkich co mieli type=1

nie wiem co oznacza u Ciebie TYPE=1 ale chyba powinno byc AND type=1

Ten post edytował maly_swd 7.11.2009, 14:01:51


--------------------
śmieszne obrazki
Kryzys: Ser jem spleśniały, wino piję stare i samochód mam bez dachu..
Go to the top of the page
+Quote Post
Largo
post 7.11.2009, 14:08:25
Post #7





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

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


Cytat(maly_swd @ 7.11.2009, 14:01:13 ) *
a ten warunej jest dobry?
WHERE `recipient_id`=$uid OR type = 1;

podaj wszystko co odebral uzytkownik o ID=5 lub podaj wszystkich co mieli type=1

nie wiem co oznacza u Ciebie TYPE=1 ale chyba powinno byc AND type=1


sender_id - ID Osoby, która wysyła kasę.
recipient_id - ID Osoby, która ją otrzymuję.
type - lista opcji systemowych, zostanie zamieniona na flagę is_system

Nie mogę dać jednego ID, bo nie zawsze jestem wysyłającym lub odbiorcą, takie podejście nic nie da. Na dodatek przy transakcjach systemowych nie podaję informacji o odbiorcy i nadaję flagę na 1, wtedy w ogóle tego nie policzy jako transakcję.

Pozdrawiam,
Largo
Go to the top of the page
+Quote Post
maly_swd
post 7.11.2009, 18:19:39
Post #8





Grupa: Zarejestrowani
Postów: 744
Pomógł: 118
Dołączył: 14.02.2009
Skąd: poziome

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


jak na moje oko to dalej to nielogiczne;)

powiedz mi jaki wynik dostaniesz:

SELECT SUM( `amount` ) FROM `fg_transactions` WHERE `recipient_id`=5 OR type = 1

a jaki przy

SELECT SUM( `amount` ) FROM `fg_transactions` WHERE `recipient_id`=5 AND type = 1



--------------------
śmieszne obrazki
Kryzys: Ser jem spleśniały, wino piję stare i samochód mam bez dachu..
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 Wersja Lo-Fi Aktualny czas: 20.06.2025 - 18:48