Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Najczęściej kupowany?
Forum PHP.pl > Forum > Bazy danych > MySQL
termin
Witam, kombinuje na rozne sposoby i za cholere nie chce pokazać proawidlowej wartosci.

Mam 2 tabele. ZAMOWIENIA i ZAMNR
[ZAMOWIENIA]
id_zamow
data
reszte rzeczy pomijam

[ZAMNR]
idprod
idzam //tutaj klucz obcy do id_zamow
nazwa
ile

Chce aby w zależnosci od wybranego zakresu dat w tabeli ZAMOWIENIA wybral mi 1 produkt z tabeli ZAMNR ktory byl najczęściej kupowany i najwięcej sprzedawany gdyby nie było to zależne od wartosci 'ile' to bym sobie poradzil, ale tak to chyba w jednym zapytaniu nie da sie tego zrobic. Przykładowo, mam 3 zamowienia:

zamowienia_1:
koperta biala, ile=5
teczka_czerwona, ile=2
zeszyt, ile=1

zamowienie_2:
zeszyt, ile=1
koperta_biala, ile=1;

zamowienie_3:
zeszyt, ile=2
gumka, ile=1

Jaka widać zeszyt był najczęściej kupowany, a koperta_biala była byla najwięcej sprzedawana.

Ktos ma jakis pomysl jak to ugryźć?
dr_bonzo
1. Czemu trzymasz nazwe produktu i jego ID w pozycji zamowienia [ZAMNR]? Wystarczy ID + join

2. nazwy kolumn, tabel masz, hmm, nieintuicyjne, co chwile musze przewijac ekran i sprawdzac jak zapisujesz nazwy pod zam_id, zamowienie_id, id_zam, idzam czy inaczej (ja stosuje zamowienie_id)

3.

SQL testowany w glowie, jakbys podal skrypt tworzacy tabele + troche danych (INSERTY) to bylo by mi latwiej.

Przedmioty ktore znalazly sie w najwiekszej ilosci zamowien (ilosc zamowien z danym przedmiotem):
SELECT COUNT( * ) AS ile
FROM ZAMNR
GROUP BY idprod ORDER BY ile DESC

zeby wybrac jeden to
... LIMIT 1

zeby wybrac z przedzialu czasowego to trzeba dolaczyc Zamowienia i ograniczyc ich date
SELECT COUNT( * ) AS suma
FROM ZAMNR
JOIN zamowienia z ON z.id = ZAMNR.idzam
WHERE z.data BETWEEN '2006-01-01' AND '2006-12-31'
GROUP BY idprod ORDER BY suma DESC


Przedmioty, ktorych najwiecej sprzedano (w sztukach)
SELECT SUM( ile ) suma -- zsumuje wartosci kolumny 'ile'
FROM ZAMNR -- z zamowien
JOIN zamowienia z ON z.id = ZAMNR.idzam
WHERE z.data BETWEEN '2006-01-01' AND '2006-12-31'
GROUP BY idprod ORDER BY suma DESC -- dla kazdego z produktow

dziala?
termin
AD 1)
nazwę produktu trzymam tylko po to bo bedzie to potrzebne do historii zamowien, ponieważ w tabeli gdzie znajduja się wszystkie towary jest tendencja że po jakimś czasie produkty zostana usunięte i zastąpione innymi, np zeszyt po pol roku, bedzie zastąpionym nowym produktem np. zeszyt 60kartek itd. chyba ze chodziło Ci o cos innego?

AD 2)
To fakt bede musiał nad tym popracować i wszystko ujednolicić, ja tez przewijam ekran smile.gif

AD 3)
Wszystko działa lecz małe zmiany trzeba bylo wprowadzić:

SELECT nazwa, COUNT(*) AS suma
FROM ZAMNR
JOIN zamowienia z ON z.id_zamow = ZAMNR.idzam
WHERE z.data BETWEEN '2006-01-01' AND '2006-12-31'
GROUP BY idzam ORDER BY suma DESC LIMIT 1

Przedmioty, ktorych najwiecej sprzedano (w sztukach)
SELECT nazwa, SUM(ile) suma
FROM ZAMNR
JOIN zamowienia z ON z.id_zamow = ZAMNR.idzam
WHERE z.data BETWEEN '2006-01-01' AND '2006-12-31'
GROUP BY nazwa ORDER BY suma DESC LIMIT 1

Bardzo Ci dziękuję, poszerzyłeś moją wiedzę na temat SQL-a smile.gif
dr_bonzo
Co do 3) --> patrz punkt 2) bo szlak mnie trafial od przewijania wiec napisalem tak zebys zrozumial kod i naniosl poprawki

Cytat
nazwę produktu trzymam tylko po to bo bedzie to potrzebne do historii zamowien, ponieważ w tabeli gdzie znajduja się wszystkie towary jest tendencja że po jakimś czasie produkty zostana usunięte i zastąpione innymi, np zeszyt po pol roku, bedzie zastąpionym nowym produktem np. zeszyt 60kartek itd. chyba ze chodziło Ci o cos innego?


Nie powinno sie zastepowac produktow. Produkt o ID=123 teraz jak i za 10 lat powinien byc tym samym produktem.
Mozesz to rozwiazac przez dodanie kolumny 'usuniety' -- przez co starego produktu nie bedzie dalo sie kupic, i bedziesz mogl sie do niego odwolac po ID z zamowienia.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.