Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> funkcja agregująca i grupowanie
bpskiba
post 18.03.2012, 14:44:14
Post #1





Grupa: Zarejestrowani
Postów: 340
Pomógł: 49
Dołączył: 3.07.2009
Skąd: Rzeszów

Ostrzeżenie: (0%)
-----


Witam
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:
  1. SELECT DATA, ilosc FROM stan WHERE id_towaru=880 AND dest=6 AND jedn=1 AND id_magazynu=2
  2. ORDER BY DATA DESC, id_stanu DESC


określenie stanu na dany dzień dla kartoteki też jest proste:
  1. 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'
  2. ORDER BY DATA DESC, id_stanu DESC
  3. LIMIT 1


Problem zaczyna się gdy chcę wyświetlić stan całego magazynu na żądany dzień.
Proste pytanie wyświetla bzdury:
  1. SELECT MAX(DATA),ilosc,id_magazynu,jedn,dest,id_towaru FROM stan
  2. WHERE id_magazynu=1
  3. GROUP BY id_towaru,id_magazynu,jedn,dest


Częściowo rozwiązałem to następująco:
  1. SELECT s1.id_towaru,s1.dest,s1.ilosc,s1.jedn
  2. FROM stan s1,(SELECT MAX(DATA) dd,id_stanu,id_towaru,dest,jedn,ilosc
  3. FROM stan
  4. WHERE DATA<'2012-03-01 00:00:00' AND id_magazynu=1
  5. GROUP BY id_towaru,dest,id_magazynu,jedn) s2
  6. 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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
pmir13
post 18.03.2012, 19:05:19
Post #2





Grupa: Zarejestrowani
Postów: 282
Pomógł: 89
Dołączył: 12.04.2011

Ostrzeżenie: (0%)
-----


W zapytaniu, które wyświetla bzdury nie możesz polegać na wartości pola ilość, bo nie jest ani w group by ani nie używasz na nim funkcji agregującej. Trudno też oczekiwać stanu całego magazynu na dany dzień skoro tego dnia w zapytaniu nigdzie nie określasz.
Co oznaczają pola jedn i dest?
Ile jest różnych towarów i magazynów?
Skoro potrzebujesz sortować nie tylko po dacie, ale też po id, to czy na pewno data jest typu datetime, jeśli tak to jak często się zdarzają modyfikacje stanu tego samego towaru w tym samym magazynie w ciągu jednej sekundy? Bo taka jest właśnie dokładność datetime.

Ten post edytował pmir13 18.03.2012, 19:12:49
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 23.06.2025 - 16:04