Autor Zpráva
Lisoe
Profil *
Zdravím,

přemýšlím jak nejlépe sestavit dotaz, kdy mám tabulku:

event_registration
id | event_id | tickets_adults | tickets_kids | payment_method_id | payment_status_id

K tomu mám tabulky event_payment_method (id, name) a event_payment_status (id, name)

A přemýšlím, jak nejkomplexněji sestavit dotaz (nebo sadu dotazů?) tak, abych dostal veškeré statistiky. Tzn. chci dostat statistiky počtu lístků (jak dospělí, tak i děti), pro jednotlivé platební metody a zároveň rozdělené na stav zaplacení.

Jestli to řešit nějak takto, za pomocí CASE nebo je nějaké "elegantnější" řešení? Níže jen příklad jednoho CASE, kde bych přidal dalších x možností a vyřešit to sice jedním dotazem, ale pokud bych např. v budoucnosti přidal platební metodu nebo stav platby, tak se bude muset dál upravovat.
SELECT 
       Sum(tickets_adults) tickets_adults, 
       Sum(tickets_kids) tickets_kids
       SUM(CASE When payment_status_id = 1 Then tickets_adults Else 0 End ) as ticket_adults_paid
FROM   
  event_registration 
WHERE 
  event_id = 3 

Díky moc za radu
Kajman
Profil
Nebojte se více dotazů, když budou dobře indexy, tak budou ve výsledku svižnější než sum(case) konstrukce.
Lisoe
Profil *
Kajman:
Díky za radu, takže klidně nějak takto:

select * from event_payment_method
-- while (php)
---- select * from event_payment_status
------ while (php)
-------- select sum(...) from event_registration where payment_method_id = EVENT_PAYMENT_METHOD_ID and event_payment_status = EVENT_PAYMENT_STATUS_ID

Chápu to správně?

Díky moc!
Kajman
Profil
Kdepak, dotazy ve while nedělejte. Proste konstantní počet dotazů podle počtu chtěných statistiky.

SELECT
       Sum(tickets_adults) tickets_adults, 
       Sum(tickets_kids) tickets_kids
FROM   
  event_registration 
WHERE 
  event_id = 3 

SELECT 
       payment_method_id,
       Sum(tickets_adults) tickets_adults, 
       Sum(tickets_kids) tickets_kids
FROM   
  event_registration 
WHERE 
  event_id = 3 
GROUP BY payment_method_id

SELECT 
       payment_method_id,
       payment_status_id,
       Sum(tickets_adults) tickets_adults, 
       Sum(tickets_kids) tickets_kids
FROM   
  event_registration 
WHERE 
  event_id = 3 
GROUP BY payment_method_id, payment_status_id

Případně může použít with rollup, ale hůře se to zpracovává na straně aplikace.
Lisoe
Profil *
Kajman:
Kam jsem dal hlavu, úplně jsem zapomněl že to můžu jednoduše groupovat. Moc díky!

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0