Autor Zpráva
freeTel
Profil *
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
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 *
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
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 *
Keeehi:
Na union jsem úplně zapomněl. Zkusím to. Děkuji moc za radu
freeTel
Profil *
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
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 *
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.

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