Autor | Zpráva | ||
---|---|---|---|
nothrem Profil |
#1 · Zasláno: 30. 5. 2006, 12:40:24 · Upravil/a: nothrem
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 ;") 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 * |
#2 · Zasláno: 30. 5. 2006, 14:26:34
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 |
#3 · Zasláno: 30. 5. 2006, 14:45:27
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 * |
#4 · Zasláno: 30. 5. 2006, 15:00:41
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 |
||
Časová prodleva: 3 měsíce
|
|||
nothrem Profil |
#5 · Zasláno: 22. 8. 2006, 11:49:22 · Upravil/a: nothrem
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 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>" |
||
Časová prodleva: 18 let
|
Toto téma je uzamčeno. Odpověď nelze zaslat.
0