Autor Zpráva
Hitman
Profil
Řeším takovou drobnost, nenepadá mě ale jak ji se svými znalostmi efektivně vyřešit. V DB mám řekněme produkty se strukturou:

nazev cena mesto
rohlik 50 praha
chleba 100 praha
rohlik 60 brno
rohlik 120 praha

Potřebuji vypsat průměrnou cenu rohlíku (produktu) v celé ČR s tím že každé město se započítá jen jednou a to poslední.

Průměrná cena rohlíku tedy bude 60+120/2. Hodnota z prvního řádku se zanedbá. Používám tohle řešení:

SELECT SUM(cena)/count(cena) AS prumer_cen FROM produkty WHERE nazev='rohlik'

A potřebuji pouze doplnit něco ve smyslu WHERE unique_last(mesto).

Díky
TomášK
Profil
Databáze nemá fixované pořadí záznamů, potřebuješ nějaký sloupec, podle které se to řadí, aby mělo význam mluvit o posledním záznamu.

SUM(cena)/count(cena) jde zapsat jako AVG(cena)

Jsou k dispozici window funkce nebo je to MySQL? Postup bude v poddotazu vybrat "poslední" produkt pro každé město a udělat z toho průměr.
Alphard
Profil
Hitman [#1]:
Návrhově, to je nějaká historie cen? Jestli by nestálo za úvahu zavést sloupec, která cena je aktivní a která ne. Ten by se musel sice udržovat nějak zvlášť, ale dotazy na aktuální ceny by pak byly naprosto triviální.
Princip hledání posledního záznamu je zde Některé časteji řešené dotazy pro MySQL - FAQ » Nalezení řádků s maximální (minimální) hodnotou, sloupec čas nebo id (jak psal [#2] TomášK) tam snad máte.
Hitman
Profil
Ano, slopupec ID záznamu samozdřejmě mám. Takže by to mělo být obalené ještě v jednom selectu?

Něco jako

SELECT AVG(cena) AS prumer_cen (SELECT FROM produkty WHERE nazev='rohlik' LIMIT 1 ORDER BY id DESC)

?

// je to aktuální cena, s tím že tam není vyřešené mazání těch starých při vkládání nových (pokud praha přidá novou cenu rohlíku, měla by se ta stará smazat/updatovat...je tam více sloupců jako platnost atp. takže jednodušší bude asi mazání). Ale i když tam mazání bude, myslím že nebude na škodu projistotu vybírat jen ten poslední, kdyby se náhodou nějaká stará nevymazala, tak ať to potom nepočítá s nějakou neaktuální cenou..
Kajman
Profil
Ne, v poddotaze potřebujete přeci nejvyšší id pro každé město.
SELECT Avg(p.cena) prumer
FROM   (SELECT Max(id) maxid
        FROM   produkty
        WHERE  nazev = 'rohlik'
        GROUP  BY mesto) m
       JOIN produkty p
         ON m.maxid = p.id
Hitman
Profil
Aha, to je ono, díky.

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