Portál AbcLinuxu, 15. července 2025 05:13
users - user_id payment - user_id, payment_id, amount demand - user_id, demand_id, amountchtel bych vypsat u uzivatele soucet jeho pohledavek a jeho plateb, muj dotaz vypada takto a vypisuje hodnoty, podle kterych to vypada ze tam nekde vznika nejaky kartezsky soucin:
SELECT u.user_id, SUM(dm.amount), SUM(p.amount) FROM users u LEFT JOIN payment p ON p.user_id = u.user_id LEFT JOIN demand dm ON dm.user_id = u.user_id WHERE dm.cancel_date IS NULL AND p.cancel_date IS NULL AND u.user_id = 1205 GROUP BY u.user_id +---------+----------------+---------------+ | user_id | SUM(dm.amount) | SUM(p.amount) | +---------+----------------+---------------+ | 1205 | 2000.00 | 1084.00 | +---------+----------------+---------------+(spravne to ma byt 1000 a 542 - v demand jsou pro tohoto uzivatele castky 500 a 500, v payment 500 a 42) kdyz vyhazu tu agregaci vypada to asi takhle:
SELECT u.user_id, dm.amount, p.amount, dm.demand_id, p.payment_id FROM users u LEFT JOIN payment p ON p.user_id = u.user_id LEFT JOIN demand dm ON dm.user_id = u.user_id WHERE dm.cancel_date IS NULL AND p.cancel_date IS NULL AND u.user_id = 1205 +---------+--------+--------+-----------+------------+ | user_id | amount | amount | demand_id | payment_id | +---------+--------+--------+-----------+------------+ | 1205 | 500.00 | 42.00 | 4 | 7 | | 1205 | 500.00 | 42.00 | 11 | 7 | | 1205 | 500.00 | 500.00 | 4 | 11 | | 1205 | 500.00 | 500.00 | 11 | 11 | +---------+--------+--------+-----------+------------+otazka zni: jak by mel vypadat dotaz, ktery vypise to co chci? (pro vice uzivatelu, ta podminka user_id = 1205 je tam jen pro demonstraci)
USER_ID AMOUNT ---------------------- ---------------------- 1205 500 1205 500spojením výsledné tabulky s payment relací jen přes user_id dostanu kartézský součín (2 x 2 = 4 řádky)
USER_ID AMOUNT AMOUNT ---------------------- ---------------------- ---------------------- 1205 500 42 1205 500 500 1205 500 42 1205 500 500no a agregace pak dá výsledky 2000 a 1084. Těžko očekávat očekávané výsledky spojení tabulek (payment a demand), které nejsou v relaci. Možné řešení
select user_id,sum(amount1),sum(amount2) from( SELECT u.user_id, dm.amount amount1, 0 amount2 FROM users u LEFT JOIN demand dm ON dm.user_id = u.user_id union SELECT u.user_id, 0, p.amount FROM users u LEFT JOIN payment p ON p.user_id = u.user_id ) GROUP BY user_id
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.