Autor Zpráva
MaK
Profil
Mám tabulku:

CREATE TABLE t1
(
id INTEGER UNSIGNED PRIMARY KEY,
c INTEGER
)

a tabulku t2, která je identická.

Pokud pro konkretní id záznam v tabulce není, má se za to, že hodnota c je nula.

Mám sestrojit dotaz, který vrátí součet sloupců c (t1.c + t2.c) pro konretní id.

Jinak řečeno, pokud je pro dané id zaznam:
+ jen v t1 - vrací dotaz hodnotu t1.c
+ jen v t2 - vrací dotaz hodnotu t2.c
+ v t1 i t2 - vrací dotaz součet t1.c+t2.c
+ nikde - vrací nulu

Vyšlo mi následujicí řešení, ale to se mi zdá poněkud obskurní:

SELECT
(SELECT IFNULL(SUM(c),0) FROM t1 WHERE id = 1) +
(SELECT IFNULL(SUM(c),0) FROM t2 WHERE id = 1) ;

Jde to nějak lépe?

MaK
Tori
Profil
MaK:
Jsou obě tabulky zhruba stejně velké, anebo je mezi nimi rozdíl v počtu řádků? (rozdíl = nezanedbatelný, aspoň 10:6)
MaK
Profil
Tori:
t1 je 100x vetsi nez t2 (t2 je neco jako cache t1).


peta:
Nefunguje pro pripady, kdy je zaznam pouze v jedne z tabulek.
Tori
Profil
Špatně jsem si to přečetla, myslela jsem, že chcete vypsat všechny, proto jsem se ptala.

SELECT IFNULL(SUM(c), 0) FROM
(SELECT c FROM t1 WHERE id = 1
UNION ALL 
SELECT c FROM t2 WHERE id = 1)
S indexem přes sloupce id, c to bude rychlejší.
Kajman
Profil
Použil bych dotaz z [#1]
MaK
Profil
Kajman:
Proc? Pouziti UNIONu se mi zda logicke a prehledne.
Kajman
Profil
Mně se zdá, že sčítání součtů jednotlivých tabulek může být o fous rychlejší než sčítání spojených hodnot z více tabulek. Můžete si to změřit.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0