Fórumok
Van egy MySQL adatbázisom, benne 2 tábla: transactions, parties. Utóbbin idegen kulcs az elsőre. Pénzügyi tranzakciók. A frontend listázni akarja a tranzakciókat egyik fél (party) szempontjából: max 50 sor/lap, egyenleg oszlop, az összes választható lapot mutatni kell, index a befoglaló dátum. Erre 2 select van: egyik a lapokat, másik az aktuális lap sorait listázza.Lapok listázása:
SELECT date_start, date_end, (@balance := @balance + sum_amount) - sum_amount AS start_balance
FROM (
SELECT MAX(date) AS date_start, MIN(date) AS date_end, SUM(amount) AS sum_amount
FROM (
SELECT transactions.t_date AS date
FROM transactions
INNER JOIN parties ON parties.transaction_id = transactions.id
WHERE parties.account_id = 12345
ORDER BY transactions.t_date ASC, transactions.id ASC
) AS all_transactions
JOIN (SELECT @rn := 0) i
GROUP BY FLOOR(@rn := @rn + 1 / 51)
ORDER BY date ASC;
) AS pages
JOIN (SELECT @balance := 0) i
Aktuális lap listázása:
SELECT transactions.*
FROM transactions
INNER JOIN `parties` ON `parties`.`transaction_id` = `transactions`.`id`
WHERE parties.account_id = 12345
ORDER BY transactions.t_date ASC, transactions.id ASC
LIMIT 50 OFFSET 50
Az aktuális lap kezdőegyenlege az első lekérdezésből származó start_balance lesz, a soronkénti számítást onnan már a frontend intézi.
Most azon kattogok, hogy nem-e lehetne egyszerűbben, kevesebb subselect használatával listázni a lapokat.
SQL guruk..?
(A t_date egy DATE oszlop, nyilván nem unique.)
- 1201 megtekintés