Autor Zpráva
freeTel
Profil *
Zdravím, mám dotaz na dotaz, který se mi nedaří dojít ke zdárnému výsledku.
1. tabulku urřitě rozebírat nemusím.
2. tabulka je cena klasická
3. tabulka je ceník individuální
Jde mi o to aby jsem získal výsledky jen z tabulky produkty. Zkoušel jsem všechno, ale správný výsledky mi to nedává. Tak se chci zeptat zkušenějších. Děkuji

    $vydelek = mysqli_fetch_array($mysqli->query("SELECT SUM(ob1.pocet*ob3.cena) AS pocetnik FROM  objednavky ob1           
    left JOIN produkty ob3 ON ob3.id = ob1.id_zbozi
    inner JOIN klient_cenik ob2 ON ob1.id_zbozi = ob2.id_produktu 
    WHERE ob1.stav='C' OR ob1.stav='F'"),MYSQLI_ASSOC);
Keeehi
Profil
freeTel:
Proč tam vůbec přidáváš tu třetí tabulku, když píšeš, že tě nezajímá?
SELECT
    objednavky.id,
    SUM(objednavky.pocet*produkty.cena) AS pocetnik
FROM
    objednavky           
LEFT JOIN
    produkty
ON
    produkty.id = objednavky.id_zbozi
WHERE
    objednavky.stav IN ('C', 'F')
GROUP BY
    objednavky.id
freeTel
Profil *
Keeehi:
Chci výsledky cen jen z tabulky produkty a z tabulky klient_cenik objednávky přeskočit
Keeehi
Profil
freeTel:
No jasně, když tam tabulku klient_cenik nepřidáš, nemůžou se ve výsledku hodnoty z ní nijak projevit.

Nicméně, celé je to takové divné. Je velmi netypické, aby objednávka měla vždy jen jednu položku. Takže by to to chtělo ukázku struktury tabulek, nejlépe i s nějakými daty. No a pak pořádně popiš, co vlastně chceš vědět. Ne ve stylu co s čím spojit (protože v tom máš evidentně zmatek) ale něco ve stylu: "Chci vědět cenu jedné konkrétní objednávky, s tím že pokud má některá položka individuální cenu, použije se ta, jinak se použije ta ceníková." Nebo: "Chci znát všechny objednávky, kde žádná z jejich položek nemá nastavenou individuální cenu." A tak podobně.
freeTel
Profil *
Keeehi:
Zmatek v tom trošku už mám, ale je to v podstatě jednoduché.
Tabulka produkty je jasná(id,nazev,cena,text)
Tabulka klient_cenik ma vlastne jen (id klienta, id_zbozi, cena)
Tabulka objednavky (id_uzivatele, id_zbozi, pocet, stav, datum)

V tabulce objednávky jsou právě i objednávky s cenou z tabulky (klient_cenik). Proto je tam zahrnuta do dotazu. Jinak by to přičítalo jinou cenu a proto se snažím udělat to, aby tyhle objednávky (ceny) přeskočil.

Ve výsledku tedy chci dosáhnout:
Výdělek na stránce pod klasickou cenou: ---- kč
Výdělek na stránce pod individuální cenou: ---- kč


Teď jsem zaseklej u prvního bodu/dotazu (Výdělek na stránce pod klasickou cenou)
Keeehi
Profil
Výdělek za všechny objednávky pod klasickou cenou
SELECT
    SUM(objednavky.pocet*produkty.cena) AS vydelek
FROM
    objednavky           
JOIN
    produkty
ON
    objednavky.id_zbozi = produkty.id
WHERE
    objednavky.stav IN ('C', 'F')

Výdělek za všechny objednávky pod individuální cenou
SELECT
    SUM(objednavky.pocet*klient_cenik.cena) AS vydelek
FROM
    objednavky           
JOIN
    klient_cenik
ON
    objednavky.id_zbozi = klient_cenik.id_zbozi AND objednavky.id_uzivatele = klient_cenik.id_klienta
WHERE
    objednavky.stav IN ('C', 'F')
freeTel
Profil *
Děkuji moc. Vyhazuje to nuly. Je pozdě a řešení je lepší hledat vyspalej. Zkusím ten kod poladit a zjistit kde je chyba, že nic nevypisuje.
freeTel
Profil *
První dotaz fungovat správně nemůže. Bude mi vyhazovat vsechny ceny i ty co spadaji do individuálního. Právě s tím se peru aby v dotazu zjistil, zda objednavka nespadá pod ceník z tabulky klient_cenik. Pokud ano, tak přeskoč. Klasicky dotaz bez zahrnutí třetí tabulky bude zmatecni. Bude vyhazovat vsechny objednavky s cenou z produktu a to i ty co mají cenu z tabulky klient_cenik.
Keeehi
Profil
Objednávky bez klientských cen
SELECT
    SUM(objednavky.pocet*produkty.cena) AS vydelek
FROM
    objednavky           
JOIN
    produkty
ON
    objednavky.id_zbozi = produkty.id
LEFT JOIN
    klient_cenik
ON
    objednavky.id_zbozi = klient_cenik.id_zbozi AND objednavky.id_uzivatele = klient_cenik.id_klienta
WHERE
    objednavky.stav IN ('C', 'F') AND
    klient_cenik.id_klienta IS NULL

Ty objednávky jen s klientskými cenami by měly fungovat.

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