ugrás a tartalomhoz

fizetési egyenleg lekérdezése

carstepPCE · 2011. Aug. 11. (Cs), 00.39
Sziasztok,

van 3 kapcsolodó tábla, amelyek:
-> objektum
-> elofizetesek (0..n objektumra)
-> befizetesek (0..n objektumra)

Olyan lekérdezést szeretnék gyártani, amely kiszámolja nekem, mekkora az hátraléka (ground_total) egyes objektumoknak.

Amivel előálltam eddig az érzésem szerint nem túl hatékony:

SELECT p.id,
    (SELECT SUM(total) FROM elofiezetesek WHERE obj_id = p.id)-(SELECT SUM(amount) FROM befizetesek WHERE obj_id = p.id AND approved = 1 GROUP BY obj_id) as GROUND_TOTAL
    FROM `objektum` p
    GROUP BY p.id
    HAVING GROUND_TOTAL > 0
Ettől biztosan létezik hatékonyabb megoldás, szerintetek merre induljak el?

Üdv
Sanyi
 
1

Én azzal kezdeném, hogy a

kuka · 2011. Aug. 11. (Cs), 09.02
Én azzal kezdeném, hogy a visszaadott mezők közé nem tennék selectet, mert rémesen be tud lassítani. Inkább a from részbe raknám:

SELECT    p.id,  
          COALESCE(e.sum,0)-COALESCE(b.sum,0) AS ground_total
FROM      objektum p  
LEFT JOIN (
          SELECT    obj_id,
                    SUM(total) AS sum 
          FROM      elofiezetesek
          GROUP BY  obj_id
          ) e
       ON e.obj_id = p.id
LEFT JOIN (
          SELECT    obj_id,
                    SUM(amount) AS sum
          FROM      befizetesek
          WHERE     approved = 1
          GROUP BY  obj_id
          ) b
       ON b.obj_id = p.id
GROUP BY  p.id  
HAVING    ground_total > 0  
(A fenti kódot kávé előtt írtam, a tévedés jogát fenntartom. És valószínűleg ki is használom…)
2

nem kell kávé!

carstepPCE · 2011. Aug. 11. (Cs), 14.23
Beillesztve és kicsit átírva a megfelelőség elve alapján működik a dolog.
Erre a LEFT JOIN -ba tett SELECT utasításra eddig nem is gondoltam, hmmm, ügyes.
Performance alapján tényleg jobbnak tűnik, de memóriaéhsége viszont nagyobb, bár nem nagy számú bejegyzésre lesz alkalmazva, úgyhogy jobb megoldás, mint az enyém :)

Köszönöm

Üdv
Sanyi