Autor Zpráva
Gogo_v
Profil *
Dobrý den.
mam takovýto select
SELECT KL.id,
		K.titul_pred, K.jmeno, K.prijmeni, K.titul_za,
		A.id AS aid,A.majitel, A.ulice, A.cpopisne, A.corientacni, A.mesto, A.psc,
		M.nazev AS owner,
    K.telefon, K.email, K.id as kid,

		SK.nazev AS knazev,
		S.id AS sid, S.cislo_smlouvy, SS.nazev AS snazev,
    IF (AK_T.nazev IS NULL OR AK.platnost_do < CURDATE(), SL_T.nazev, AK_T.nazev) AS sluzba_nazev
	FROM klient KL

	LEFT JOIN kontakt K ON
		KL.id = K.Klientid
	LEFT JOIN klient_stav SK ON
		SK.id = KL.Klient_stavid
	LEFT JOIN (smlouva S, smlouva_stav SS) ON
		KL.id = S.Klientid AND SS.id = S.Smlouva_stavid
	LEFT JOIN adresa A ON
		A.id = KL.Adresaid 
		
  LEFT JOIN majitele M ON
		M.id = A.majitel 
	
  LEFT JOIN fakturace F ON
	F.id = S.Fakturaceid

	LEFT JOIN sluzby SL ON
		S.id = SL.smlouva
	LEFT JOIN sluzby AK ON
		AK.akce = SL.id

	LEFT JOIN sluzby_typ SL_T ON
		SL.sluzba = SL_T.id
	LEFT JOIN sluzby_typ AK_T ON
		AK.sluzba = AK_T.id

	WHERE ((S.Smlouva_stavid IS NULL) OR (S.Smlouva_stavid != 3))
	GROUP BY K.id
	ORDER BY K.prijmeni, K.jmeno

kde ve scriptu upravuju podminky WHERE
	WHERE ((CONCAT(K.prijmeni, ' ', K.jmeno) LIKE '%Holub%') OR (K.telefon LIKE '%Holub%') ) AND ((S.Smlouva_stavid IS NULL) OR (S.Smlouva_stavid != 3))
	GROUP BY K.id
	ORDER BY K.prijmeni, K.jmeno

To vše funguje více méně jak má problém je že u jednotlivých klientů může být nebo nemusí více služeb většinou je ale jen u jedné nastaveno aktivní. To co je špatně je že mi to píše u klienta první načtenou službu. což je samozřejmě dáno tím selectem. Věděl bych i jak zjistit aktuální službu do podmínky přidám
AND SL.povoleno=1
a tady mám problém. u těch filtrů by to mělo primárně vypsat všechny záznamy o klientech tedy i bez definované služby, a když tam narvu tu podmínku tak už mi pochopitelně nevypíše zaznamy kde neni Sl.povoleno definované. Nevím jestli lze v podmínkách WHERE používat IF , tedy zda je možná konstrukce
WHERE ((CONCAT(K.prijmeni, ' ', K.jmeno) LIKE '%Holub%') OR (K.telefon LIKE '%Holub%') ) AND ((S.Smlouva_stavid IS NULL) OR (S.Smlouva_stavid != 3)) AND IF(SL.povoleno != "",SL.povoleno=1,""),
to co jsem vypotil je samozřejmě nefunkční zkoušel jsem v rámci mých znalostí různé konstrukce ovšem bez úspěchu.
Děkuji za pomoc.
Joker
Profil
Gogo_v:
AND IF(SL.povoleno != "",SL.povoleno=1,"")
Takhle to nejde, ale stejný výsledek jako tohle by mělo: AND ((SL.povoleno = 1) OR (SL.povoleno="")).
Ale ten výraz je divný, protože část bere sloupec povoleno jako řetězec a část jako číslo. Jakého je to typu?
Gogo_v
Profil *
Joker:
Ja to asi špatně popsal pointa je jinde, u klientu kde neni služba definovaná ten sloupec SL.povoleno vůbec není nemůžu tedy napsal SL.povoleno cokoliv protože ten sloupec tam prostě není :(
 `povoleno` tinyint(1) NOT NULL
takze přes JOIN tam žádnou hodnotu z tabulky služby vůbec nenačte. Otázka tedy je jak ošetřit selecty s join když tam nějaká tabulka není definovaná a přizpůsobit k tomu WHERE
Gogo_v
Profil *
odpověď je
AND (SL.povoleno = 1 OR SL.povoleno IS NULL)
takhle to funguje nechápu nad čím jsem celý víkend laboroval :D
Kajman_
Profil *
Gogo_v:
Tu podmínku můžete dát rovnou do spojení
LEFT JOIN sluzby SL ON
        S.id = SL.smlouva AND SL.povoleno = 1
Gogo_v
Profil *
Kajman:
Děkuji za inspiraci určitě to někde využiju, ale v tomto případě nemůžu, jak říkam skládám docela šílené možnosti do filtru takže tím bych uřízl možnost vyfiltrovat volbu všechny neaktivní služby. Kažopádně děkuji za pomoc

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