Mam taki problemik:
Jest sobie tabela, w której trzymane są kartoteki magazynowe
stan:
id_towaru int(11) NOT NULL
id_magazynu int(11) NOT NULL
id_stanu int(11) NOT NULL PRIMARY KEY
data datetime NOT NULL
ilosc double(15,4) NOT NULL
jedn int(20) NOT NULL
dest mediumint(9) NULL
Budowanie poszczególnych kartotek jest proste:
SELECT DATA, ilosc FROM stan WHERE id_towaru=880 AND dest=6 AND jedn=1 AND id_magazynu=2 ORDER BY DATA DESC, id_stanu DESC
określenie stanu na dany dzień dla kartoteki też jest proste:
SELECT ilosc FROM stan WHERE id_towaru=880 AND dest=6 AND jedn=1 AND id_magazynu=2 AND DATA<'2012-03-03 00:00:00' ORDER BY DATA DESC, id_stanu DESC LIMIT 1
Problem zaczyna się gdy chcę wyświetlić stan całego magazynu na żądany dzień.
Proste pytanie wyświetla bzdury:
SELECT MAX(DATA),ilosc,id_magazynu,jedn,dest,id_towaru FROM stan WHERE id_magazynu=1 GROUP BY id_towaru,id_magazynu,jedn,dest
Częściowo rozwiązałem to następująco:
SELECT s1.id_towaru,s1.dest,s1.ilosc,s1.jedn FROM stan s1,(SELECT MAX(DATA) dd,id_stanu,id_towaru,dest,jedn,ilosc FROM stan WHERE DATA<'2012-03-01 00:00:00' AND id_magazynu=1 GROUP BY id_towaru,dest,id_magazynu,jedn) s2 WHERE s1.DATA=s2.dd AND s1.id_towaru=s2.id_towaru AND s2.dest=s1.dest AND s1.jedn=s2.jedn
Jest to wyjątkowo kiepskie rozwiązanie...
Po pierwsze jego czas jego wykonania jest nie do przyjęcia, a po drugie nie uwzględnia drugiego elementu sortowania (w przypadku tej samej wartości datetime sortuję malejąco po id_stanu).
Będę wdzięczny za wszystkie pomysły i sugestie.
Piotrek