Autor | Zpráva | ||
---|---|---|---|
freeTel Profil * |
#1 · Zasláno: 11. 3. 2020, 17:39:46
Zdravím, chci se zeptat na poslední věc:
mám dotaz a porovnávám dvě ceny ze dvou tabulek. Chci dosáhnout toho, že podmínku budou akceptovat obě tabulky. Zkoušel jsem všechny mnou dostupné možnosti a výsledek je, že se pořád výsledek zobrazuje dokud druhá cena není taky mimo podmínku. Prosím o poslední záchranou pomoc. SELECT ob.id,ob.id_kategorie,us.id_produktu,ob.nazev,ob.znacka,ob.cena,us.id_klienta,us.cenik,pm.cen_relace FROM produkty ob LEFT JOIN klient_cenik us ON ob.id = us.id_produktu AND us.id_klienta='7' LEFT JOIN user pm ON pm.id='7' WHERE ob.id_kategorie IN(2,3,4,5) HAVING (us.cenik >= 1.7391304347826 AND us.cenik <= 1038.2608695652) OR (ob.cena >= 1.7391304347826 AND ob.cena <= 1038.2608695652) ORDER BY ob.cena ASC, us.cenik ASC |
||
Tomášeek Profil |
#2 · Zasláno: 11. 3. 2020, 18:05:36
freeTel:
Nejsem specialista, a ani se mi nechce chápat ten chuchel, co jsi sem poslal. Ale nechybí ti tam závorky náhodou v tom havingu? Having ((... and ...) or (... and ...)) |
||
freeTel Profil * |
#3 · Zasláno: 11. 3. 2020, 18:14:49
Tomášeek:
Kéž by to bylo tak lehké, ale děkuji za tip. |
||
Keeehi Profil |
Nemáš tam žádný GROUP BY, takže HAVING tam nemá co dělat (tedy ne že by validní příkazy s HAVING a bez GROUP BY neexistovali, ale v tvém případě to nedává smysl). Takže ta podmínka je potřeba dát do WHERE části.
SELECT ob.id, ob.id_kategorie, us.id_produktu, ob.nazev, ob.znacka, ob.cena, us.id_klienta, us.cenik, pm.cen_relace FROM produkty ob LEFT JOIN klient_cenik us ON ob.id = us.id_produktu AND us.id_klienta='7' LEFT JOIN user pm ON pm.id='7' WHERE ob.id_kategorie IN(2,3,4,5) AND ( (us.cenik >= 1.7391304347826 AND us.cenik <= 1038.2608695652) OR (ob.cena >= 1.7391304347826 AND ob.cena <= 1038.2608695652) ) ORDER BY ob.cena ASC, us.cenik ASC |
||
freeTel Profil * |
Keeehi:
Děkuji za pomoc, ale Váš kod mi nevrací nic. Dobrý, omylem jsem smazal znaménko. Chová se to úplně stejně jako původní zápis. Tam je problém s tím OR, ale pokud ho nahradím za AND, tak to dělá ještě větší bordel. Stejně tak mě i štve, že nemůžu zařadit posloupnost od ceny protože to jsou dvě tabulky Zkusil jsem to i takhle, ale pořád stejné chování. Jediné čeho tím docílím je, že se mi změní cena a vezme si cenu z tabulky produkty, ale produkt nevyloučí SELECT ob.id, ob.id_kategorie, us.id_produktu, ob.nazev, ob.znacka, ob.cena, us.id_klienta, us.cenik, pm.cen_relace FROM produkty ob LEFT JOIN klient_cenik us ON ob.id = us.id_produktu AND us.id_klienta='7' AND ((us.cenik IS NOT NULL) AND (us.cenik >= 1.7391304347826 AND us.cenik <= 1177.3913043478)) LEFT JOIN user pm ON pm.id='7' WHERE ob.id_kategorie IN(2,3,4,5) AND (ob.cena >= 1.7391304347826 AND ob.cena <= 1177.3913043478) ORDER BY ob.cena ASC, us.cenik ASC |
||
Keeehi Profil |
#6 · Zasláno: 12. 3. 2020, 01:20:54
„Tam je problém s tím OR, ale pokud ho nahradím za AND, tak to dělá ještě větší bordel.“
Buď chceš, aby platila alespoň jedna podmínka a pak použij OR nebo mají platit obě zároveň a pak použij AND. freeTel: „Stejně tak mě i štve, že nemůžu zařadit posloupnost od ceny protože to jsou dvě tabulky“ No výsledek je vlastně jedna široká tabulka. Pokud by jsi raději měl cenu z jedné původní tabulky v jednom řádku a cenu z té druhé v nějakém jiném řádku, abys ty jednotlivé řádky mohl následně seřadit, pak nepotřebuješ JOIN ale UNION. |
||
freeTel Profil * |
#7 · Zasláno: 12. 3. 2020, 02:24:14
Keeehi:
Na union jsem úplně zapomněl. Zkusím to. Děkuji moc za radu |
||
freeTel Profil * |
#8 · Zasláno: 12. 3. 2020, 06:51:26
union musí mít shodný dotaz, tak další výsledky jako je třeba název zboží pomocí toho nedosáhnu. I tak děkuji za radu. Zkusím něco rozumného vymyslet
|
||
Kajman Profil |
#9 · Zasláno: 12. 3. 2020, 07:27:19
freeTel:
Zkuste rozumě popsat, co se má vlastně hledat. Moc jsem to z [#1] nepoznal. Klidně i nějaké příklady dat a chtěného výsledku, z kterých to bude jasné. Data lze nachystat i na sqlfiddle.com Střelbou od boku bych tipnul, že pokud nemá uživatel stanovou vlastní cenu, bere se výchozí cena a podmínka na rozmezí se má brát jen na tu výslednou a ne na obě. Pak zkuste where ob.id_kategorie IN (2,3,4,5) AND coalesce(us.cenik, ob.cena) BETWEEN 1.7391304347826 AND 1038.2608695652 |
||
freeTel Profil * |
#10 · Zasláno: 12. 3. 2020, 10:32:18
Kajman:
Vždy to pochopíte a střelíte dobře. Takhle všechno funguje jak má. Moc děkuji a příště se pokusím víc upřesnit problematiku. |
||
Časová prodleva: 4 roky
|
0