![]() |
![]() ![]() |
![]() |
![]()
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:
określenie stanu na dany dzień dla kartoteki też jest proste:
Problem zaczyna się gdy chcę wyświetlić stan całego magazynu na żądany dzień. Proste pytanie wyświetla bzdury:
Częściowo rozwiązałem to następująco:
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 |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 4 340 Pomógł: 542 Dołączył: 15.01.2006 Skąd: Olsztyn/Warszawa Ostrzeżenie: (0%) ![]() ![]() |
A dlaczego nie grupujesz po dacie
![]()
-------------------- I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy. QueryBuilder, Mootools.net, bbcradio1::MistaJam http://www.phpbench.com/ |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 340 Pomógł: 49 Dołączył: 3.07.2009 Skąd: Rzeszów Ostrzeżenie: (0%) ![]() ![]() |
A dlaczego nie grupujesz po dacie ![]()
Witaj samo grupowanie nie wystarczy gdyż chcę wyszukać dla każdej kartoteki tylko jedną datę - najpóźniejszą, więc musi być SELECT max(data)...... a wtedy grupowanie po dacie traci sens. Dobrze myślę? Piotrek |
|
|
![]()
Post
#4
|
|
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 |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 340 Pomógł: 49 Dołączył: 3.07.2009 Skąd: Rzeszów 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. jedn - jednostka (kg,litr,itd. ) dest - przeznaczenie (produkcja własna, sprzedaż i kilka innych) każda kartoteka ma 4 cechy (id_towaru, id magazynu, jednostka, przeznaczenie) Towarów jest kilka tysięcy (i rośnie) Magazynów jest kilkanaście Magazynierzy wprowadzają towar na stan z datą bierzącą. Możliwa jest więc sytuacja gdy dwóch magazynierów w tej samej sekundzie przyjmie ten sam towar. Prawo Merfy'ego mówi, że jak coś się może sp....ić to kiedyś się sp...oli. Zresztą baza danych już pokazała taki przypadek ![]() ![]() Kartoteka układa się ok i to zostawmy. Odnośnie zamego zapytania.... Uwagi niewątpliwie słuszne. Pytanie brzmi jak je rozwiązać. Samego dnia w sposób ostry nie można określić, gdyż towar mógł wpaść na kartotekę dużo wcześniej i nie na każdej kartotece operacje przeprowadza się codziennie. Piotrek Ten post edytował bpskiba 18.03.2012, 20:38:06 |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 282 Pomógł: 89 Dołączył: 12.04.2011 Ostrzeżenie: (0%) ![]() ![]() |
Jeśli chodzi o rozwiązanie to proponuję:
oraz
Ten indeks wygląda groźnie, ale jest konsekwencją takiej a nie innej struktury danych. Nie wiem jaki czas wykonania zapytania byłby akceptowalny, ale nie sądze by przy tym rozmiarze bazy przekraczał 1s, poza tym pole do optymalizacji jest niewielkie, raczej ciężko będzie znaleźć coś, co da poprawne wyniki w zauważalnie krótszym czasie. |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 340 Pomógł: 49 Dołączył: 3.07.2009 Skąd: Rzeszów Ostrzeżenie: (0%) ![]() ![]() |
oooooooooo o To zapytanie wygląda bardzo zachęcająco ![]() Moje zapytanie trwało 4-5 s i to było nie do przyjęcia. Potrzebuję nieco czasu na testy i przemyślenia, ale pierwsze efekty wyglądają doskonale. Wielkie dzięki za pomoc Piotrek |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 22.06.2025 - 16:34 |