Autor Zpráva
nowis
Profil
Zdravím,

svůj dlouhý dotaz, na kterém pracuji asi hodinu jsem zkrátil na ukázku:

SELECT poptavky.aktivni as aktivni
FROM poptavky
UNION
SELECT 'on' as aktivni
FROM nabidky
WHERE aktivni = 'on'

Dělám to tak proto, že potřebuji doplnit sloupec, který v tabulce poptvky neexistuje (všechny nabídky jsou vždy "on" takže není potřebný)
Proč mi prosím nefunguje WHERE? Vyhodí to chybu že to nezná sloupec "aktivni" Když dám WHERE pryč, tak to tabulku vypíše správně.

Děkuji
Tori
Profil
Pokud část where doplňujete dynamicky a zbytek chcete nechat jak je, tak dávejte podmínku až na výsledek celého unionu:
(SELECT ..
UNION
SELECT ...
) WHERE `aktivni` = 'on'

Jinak by bylo efektivnější použít podmínku tam, kde databáze může využít indexy:

SELECT ..
FROM poptavky
WHERE aktivni = 'on'
UNION
SELECT ..
FROM nabidky -- bez téhle podmínky
I když možná i ten první případ si bude DB schopná nějak optimalizovat, nevím. Podívejte se na explain.
nowis
Profil
Děkuji. To bude asi opravdu ten problém. Nicméně, když to takto napíšu, je tam nějaký problém se syntaxí. Můžu vás poprosit o ještě jedno nakopnutí?

(SELECT poptavky.aktivni as aktivni
FROM poptavky
UNION
SELECT 'on' as aktivni
FROM nabidky
) WHERE aktivni = 'on'
Tori
Profil
Můžu poprosit tu chybovou hlášku?
nowis
Profil
Tori:
jistě:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UNION SELECT 'on' aktivni FROM nabidky) WHERE aktivni = 'on'' at line 3
Tori
Profil
Aha jasně. Takhle se dá použít jenom řazení: (select 1 union select 2) order by, kdežto dodatečné filtrování by se muselo přidat buď do každého selectu (= efektivnější), anebo takhle: select * from (select 1 union select 2) as u where .. (alias pro celý union je nezbytný).
nowis
Profil
Tori:
Báječné, děkuji!

Do každého selectu to dávat nemohu, resp nechci, pak bych to zase musel kostrbatě řešit v php. A o efektivitu v tomto případě zase tolik nejde… Ale budu na to příště myslet :-)

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: