Portál AbcLinuxu, 15. července 2025 05:13


Dotaz: sql problem

b42 avatar 11.12.2006 21:40 b42 | skóre: 12 | Ostrava/Brno
sql problem
Přečteno: 162×
Odpovědět | Admin
zdravim,

mam 3 tabulky, obsahujici nasledujici kolonky:
users - user_id
payment - user_id, payment_id, amount
demand - user_id, demand_id, amount
chtel 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)
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

11.12.2006 22:44 jekub | skóre: 9 | blog: noblog
Rozbalit Rozbalit vše Re: sql problem
Odpovědět | | Sbalit | Link | Blokovat | Admin
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)

Já bych si raděj položil otázku, proč dostávám výsledek, jaký dostávám. Třeba proto, že: spojením users a demand dostanu
USER_ID                AMOUNT                 
---------------------- ---------------------- 
1205                   500                    
1205                   500                    
spojení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                    500                    

no 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
b42 avatar 11.12.2006 22:57 b42 | skóre: 12 | Ostrava/Brno
Rozbalit Rozbalit vše Re: sql problem
Diky za odpoved.

Proc dostavam vysledek jaky dostavam jsem celkem tusil, nicmene nevedel jsem co s tim. Vypadalo to jako trivialni ucebnicovy priklad, takze jsem myslel ze to pujde vyresit nejak trivialne ... jakozto uzivatel mysql se subselecty neumim pracovat:) (no dobre, neumim prakticky nic a mysql za to nemuze)

Jinak asi by tam melo byt UNION ALL (v mysql, nevim jestli i jinde) pro pripad, ze se vyskytnou dve stejne castky.
11.12.2006 23:07 jekub | skóre: 9 | blog: noblog
Rozbalit Rozbalit vše Re: sql problem
Union all, přesně tak. Ještě jsem kvůli tomu zapínal počítač, abych to napravil :-)

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.