Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Statystyki transakcji
Forum PHP.pl > Forum > Bazy danych > MySQL
Largo
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
vokiel
Pokaż co masz, to spróbujemy zoptymalizować...
Largo
  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ć?
vokiel
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;

Largo
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
maly_swd
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
Largo
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
maly_swd
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

To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.