Autor Zpráva
gaminn
Profil *
Zdravím,
mám SQL dotaz, kterým vybírám data z tabulky. Mimo jiných sloupců mám sloupce sloupec1 a sloupec2. Jak docílit toho, abych měl v sadě výsledku hodnotu sloupec1, pokud není nulová, pokud je, potom hodnotu sloupec2? Tato hodnota bude mít alias třeba sloupec.
Kajman_
Profil *
select ifnull(sloupec1,sloupec2) sloupec ... null
select if(sloupecs!=0,sloupec1,sloupec2) sloupec ... 0
gaminn
Profil *
Díky, to je ono.
gaminn
Profil *
Měl bych další, podobný, problém.

V klauzuli WHERE provádím subselect, na jehož základě potřebuji změnit podmínky. Pokud subselect vrátí nějaký řádek, tak potřebuji, aby sloupec1 = sloupec2. Pokud subselect nevrátí ani jeden řádek, žádná podmínka nemusí být. Všechny mé dosavadní pokusy skončily fiaskem.
gaminn
Profil *
Jen jsem to dopsal, už jsem si všimnul chyby, kterou jsem udělal. ALe když jsme u toho - jde u zápisu:

....... WHERE (zde jsou pevné podmínky) AND IF((SELECT id FROM tabulka WHERE sloupec = jiny_sloupec_z_jine_tabulky LIMIT 1), sloupec1 = sloupec2, 1)

něco zlepšit?
gaminn
Profil *
Asi bych měl jít už spát, protože se na něco zeptám a hned si odpovím, ale zřejmě si ještě jednu otázku neodpustím:

Potřebuji v klauzuli GROUP BY určit, aby se seskupily dle daného sloupce pouze ty záznamy, které mají ve sloupci hodnotu různou od nuly. Jak na to?
Kajman_
Profil *
něco zlepšit?
Celé přepsat přes join tabulek.

group přece omezí normálně
where sloupec!=0
gaminn
Profil *
Kajman_
Celé přepsat přes join tabulek.
Ano, nad tím jsem také přemýšlel, jenže vše se má takto (hloupější příklad na pochopení jsem asi nemohl vymyslet, ale co se dá dělat...):

mám tabulku garaz_typ:

id name
1 jméno1
2 jméno2

a tabulku auta_sablona:
id id_garaz_typ name
1 2 auto1
2 2 auto2

Těmito tabulkami specifikuji reálné garáže. To znamená, že typ garáže s id 2 musí mít vždy ve vozovém parku všechna 2 auta, která jsou specifikována v tabulce vozovy_park. Naopak typ garáže s id 1 nemá vozový park nijak specifikovaný, tudíž může mít jakékoliv auto. No a nyní mám tabulku, kde jsou již garáže:

garaz:
id id_garaz_typ
1 1 // tato garáž má být vytvořena podle návrhového vzoru z dvou tabulek výše, které se týkají typu garáže s id = 1
2 2 // - || - id = 2

auta:
id id_garaz id_garaz_typ id_auto_sablona
1 1 1 0
2 1 1 0
3 2 2 1
4 2 2 2

No a nyní chci vybrat všechna auta, ze všech garáží, ale chci ošetřit při výběru to, aby auta v garáži souhlasila s návrhem v tabulce auta_sablona jak jsem popsal výše. (je možné, že mi řeknete, že to bych měl ošetřovat už při vkládání záznamů do tabulek, ale já bych byl orpavdu rád za toto řešení)

group přece omezí normálně
where sloupec!=0

Ne, to nepůjde, budu pokračovat na daném příkladě:

Tímto jsem chtěl ošetřit, aby reálná garáž neobsahovala třeba 2 stejná auta specifikovaná v její šabloně aut. Typ garáže, který nemá zaveden žádná auta v šabloně, jak jsem již říkal, může mít libovolný počet aut (v příkladu konkrétně je to garáž s id = 1 (nebo-li typ garáže s id = 1)). (možná, že toto ošetření nebude již potřeba, protože v prvním požadavku, jsem už uvedl, že chci, aby auta v garáži souhlasila se svou šablonou)


Doufám, že se někomu bude chtít odpovídat...;) Díky.
gaminn
Profil *
Omlouvám se, v textu použíám název tabulky vozovy_park - je to jen omylem napsaný "alias" k tabulce auta_sablona.
Kajman_
Profil *
asi bych to rozdělil na

auta_co_nemaji_zadne_auto_v_sablone
union all
auta_co_odpovidaji_sablone
gaminn
Profil *
OK a nyní tedy ještě: Jak zajistit, aby auta z garáže přesně odpovídala své šabloně dle toho, jaký typ garáže byl vybrán (tedy, aby v garáži bylo každé auto zastoupeno právě jednou dle zvolené šablony)?
Kajman_
Profil *
select a.* from auta a, garaz g, auta_sablona s
where a.id_garaz=g.id_garaz and a.id_garaz_typ=g.id_garaz_typ
and s.id=a.id_auto_sablona
and s.id_garaz_typ=a.id_garaz_typ

nebo tak nějak.
gaminn
Profil *
Kajman_
V takovém dotazu právě není ošetřena třeba přítomnost dvou stejných aut v jedné garáži... Já už jsem se ale ve svém dotazu, ke kterému jsem potřeboval touto otázkou dopomoci, nějak dospěl, takže to asi nebudeme dále řešit...
Toto téma je uzamčeno. Odpověď nelze zaslat.

0