Autor Zpráva
nothrem
Profil
Nevím jak tohle udělat a jestli tohle vůbec půjde udělat, protože nejsem tak zběhlý ve složitějších sql příkazech

$query = mysql_query("SELECT * FROM vyrobky WHERE ( id >= $od ) and ( id <= $do) ORDER BY id ASC ;")


if (mysql_num_rows($query) > 0)
{ //výpis
while ($values = mysql_fetch_assoc($query))
{
//získání ceny výrobku
$ceny = mysql_query("SELECT cena FROM ceny WHERE (typ = 3) and (vyrobek = {$values['id']}) and (datum <= NOW()) ORDER BY datum DESC LIMIT 1;")
if (mysql_num_rows($ceny) > 0)
list($cena) = mysql_fetch_array($ceny);
else
$cena = '-';
$values['cena'] = $cena
... //zpracování pole $values
}
}

Tedy, vybere všechny výrobky z tabulky výrobků a pak z tabulky ceny vybere ke každému výrobku jeho nejnovější cenu.

Tak jak je to teď je potřeba několika stovek požadavků na DB (pro každý výrovek). Když jsem to zkoušel udělat do jediného příkazu (přes JOIN), tak v nejlepším případě jsem došel k
"SELECT * FROM vyrobky LEFT JOIN ceny ON (ceny.vyrobek = vyrobky.id) and (ceny.typ = 3) GROUP BY vyrobky.id"
ale tady nevím, jestli to vybere tu nejnovější.

díky za jakékoliv zjednodušení

PS: 'typ' ceny je pro rozlišení nákupní, skladové, prodejní; vždy je použita jen jedna
Kajman_
Profil *
Možná takto nějak

SELECT v.*, ifnull(c1.cena,'-') cena FROM vyrobky v LEFT JOIN ceny c1 ON c1.vyrobek=v.id and c1.typ=3 c1.datum<=NOW() LEFT JOIN ceny c2 ON c1.id=c2.id and c1.datum<c2.datum WHERE c2.id is null
nothrem
Profil
Díky, ale ne. Tohle taky vyhodí výrobek pro každou cenu a moje pokusy o nápravu vyhazují nejstarší cenu místo nejnovější :(

Asi zůstanu u toho, necham si k ceně vypsat eště datum a sám vyberu ten nejnovější
Kajman_
Profil *
Tak snad tohle :-)

SELECT v.*, ifnull(c1.cena,'-') cena FROM vyrobky v LEFT JOIN ceny c1 ON c1.vyrobek=v.id and c1.typ=3 c1.datum<=NOW() LEFT JOIN ceny c2 ON c1.id=c2.id and c1.datum>c2.datum WHERE c2.id is null
nothrem
Profil
Už jsem na to konečně přišel (i když náhodou u něčeho jiného). Takže pokud by někdo hledal stejné nebo podobné řešení, tady je:

SELECT vyrobky.*, c2.cena, c2.datum

FROM vyrobky, (
SELECT c1.*
FROM ceny AS c1
WHERE (typ = 2) and (datum <= NOW())
ORDER BY vyrobek ASC , datum DESC
) AS c2
WHERE ( vyrobky.id = c2.vyrobek )
GROUP BY vyrobek


Tedy první vnořený select vybere všechny ceny zvoleného typu (jako tabulka c1) a seřadí je sestupně podle data - pro každý výrobek je tedy nejaktuálnější cena první.
Výsledek se vloží jako vstupní tabulka c2 do druhého selectu, který je přiřadí k datům z DB výrobků, takže pro každou kombinaci výrobku a ceny vznikne jeden řádek.
Nakonec se data seskupí podle čísel výrobků, takže pro každý výrobek zůstane jen první hodnota - ta s nejaktuálnější cenou (díky seřazení)

Takže poučení na závěr ( :-) ): pokud potřebujete několikrát udělat "SELECT *** LIMIT 1" poslouží stejně "SELECT * FROM (SELECT *** ORDER BY <co se liší>) GROUP BY <co se shoduje>"
Toto téma je uzamčeno. Odpověď nelze zaslat.

0