Portál AbcLinuxu, 9. listopadu 2025 17:35
SELECT timediff(now(), a.close_time) AS estimate , p.nazov_t, a.start_price, a.start_price+sum(b.bid) AS actprice, a.* FROM app_aukcia a right join tovar p ON a.id_tovar=p.id JOIN app_aukcia_bids b ON b.id_aukcia=a.id WHERE a.closed='n' ORDER BY close_time DESC;ďakujem pekne
Řešení dotazu:
left OUTER join app_aukcia_bidsnebo mozna
right outer, s timhle vzdycky trochu bojuju
SELECT SUM(b.bid) AS spolu,a.* FROM app_aukcia a LEFT OUTER JOIN app_aukcia_bids b on b.id_aukcia=a.id WHERE a.closed='n' ORDER BY close_time DESC;teraz sa to správa tak isto, teda zobrazuje iba riadky, pri ktorých je v druhej tabulke bid
Hned na úvod musím s politováním konstatovat, že dotaz nikdy fungovat nebude, protože je prostě špatně napsaný.
Proč?
Tak zaprvé: klíčové slovo OUTER nemá na vykonávání joinů vliv; je prostě nepovinné.
Zadruhé: Rozdíl mezi LEFT [ OUTER ] JOIN a RIGHT [ OUTER ] JOIN:
LEFT JOIN: to, pro co napravo od klauzule neexistuje odpovídající entita, je nahrazeno NULLy.
RIGHT JOIN: to, pro co nalevo od klauzule — tedy řídící množina je ta napravo — neexistuje odpovídající entita, je nahrazeno NULLy.
FULL OUTER JOIN, kde jsou řídícími množinami obě strany. Pak se lze v dokumentaci dočíst o CROSS JOIN, což je kartézský součin.
INNER JOIN, což znamená: dej mi to, co je vlevo a zároveň v pravo. Co na libovolné straně přebývá, zahoď.
GROUP BY klauzule, byť MySQL (a potažmo i do určité míry i SyBase ASE) ji odpouští. To ale na věci nic nemění. Uvádět se má. Když ji vynecháš, databáze si groupuje jak chce — to znamená, že ztrácíš kontrolu.
OK, rozeberme si ten dotaz:a.start_price versus a.*. Hvězdička je jen pro ten nejtvrdší devel.TOVAR, protože RIGHT JOIN. K ní se dohledají aukce. Pak to celé omezíš (JOIN znamená INNER JOIN!) těmi přihozeními.
NULL stejně jako operátory. To znamená, že 1 + NULL je prostě NULL. A i tak SUM() NULLů je NULL. Takže když k NULLu vráceným agregační funkcí přičteš konstantu, výsledek je NULL. NULLový výstup agrgační funkce se tedy musí převést na nějakou hodnotu.
Tím končím.
V příloze máš skript (ano, pro Oracle, protože tu nic jiného nemám), který by ti mohl být užitečný. Víc dát nemůžu, protože jsi neposkytnul testovací data.
P.S.: V diskuzi uvádíš, že ti nefunguje ani dotaz jen nad tabulkami aukcí a přihozeními. Zkontroluj si integritu dat. Tyhle primitivní spojení fungují i v Excelu a Accessu!
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.