[mysql] problem z pobraniem danych sprzedaży

0

mam 3 tabele

  1. produkty

id | nazwa

1 | grzybek
2 | marchewka
3 | mleko

  1. produkty_sklepy

id_sklepu | id_produktu | ilosc

1 | 1 | 4
1 | 4 | 4
7 | 1 | 2
7 | 2 | 8
7 | 3 | 9

  1. promocje

id_produktu | ilosc | cena

1 | 2 | 4,55
2 | 2 | 4,55
2 | 8 | 18

problem:

  1. muszę pobrać wszystkie dane z tabeli produkty
  2. left joinem muszę pobrać dane z tabeli sklepów dla powiedzmy konkretnego sklepu o id_sklepu = 7
  3. dla każdego dołączonego rekordku z tabeli produkty_sklepy trzeba wybrać rekord z tabeli promocje, porównując ilość na sklepie z ilością w promocji i wybrać właściwą cenę
  4. dla tych wierszy z tabeli produkty, które nie dało się połączyć z tabelą produkty_sklepy trzeba wybrać najniższą cenę z tabeli promocji

i wszystko to pamiętając, że ma się to tyczyć 1 sklepu dla znanego id_sklepu = 7

czy da się to zrobić 1 zapytaniem? :D
wiem, lekko zakręcone ale muszę to w php obrobić, struktury nie mogę zmienić a w pętli nie chcę pobierać danych

ma ktoś pomysł??

0

em w tabeli produktów zabrakło 4 rekordu
4 bułki

;-)

0

left join nie wystrcza?

0

problem w tym że już kompletnie nie mam pomysłu jak zrobić drugiego joina
patrz pkt 3 - 4

0

Zacząłbym od tego że same tabele są trochę bez sensu, ale to nam zaraz wyjdzie w praniu.
Lecimy po kolei:

  1. " muszę pobrać wszystkie dane z tabeli produkty"
select *
from produkty
  1. left joinem muszę pobrać dane z tabeli sklepów dla powiedzmy konkretnego sklepu o id_sklepu = 7
select p.id, p.nazwa, ps.id_sklepu, ps.ilosc
from produkty as p left join produkty_sklepy as ps on p.id = ps.id_produktu
where ps.id_sklepu = 7 --lub jakis inny ;]

No i tu zaczynają się schody...
3. "Dla każdego dołączonego rekordu z tabeli produkty_sklepy trzeba wybrać rekord z tabeli promocje, porównując ilość na sklepie z ilością w promocji i wybrać właściwą cenę"
Problem: co jeśli w tabeli promocje nie ma produktu który mamy już w naszej wynikowej tabeli do której joinujemy? Co znaczy "porównując ilość"? Jeśli ta ilość jest różna (mniejsza?) to co się ma dziać? Buczeć i świecić? Co to w ogóle znaczy "właściwą cenę"?

  1. "Dla tych wierszy z tabeli produkty, które nie dało się połączyć z tabelą produkty_sklepy trzeba wybrać najniższą cenę z tabeli promocji"
    Problem: A jeśli ich w ogóle w tabeli promocje nie ma to co?

Rozumiem że tabela "produkty" to tabela słownikowa, ok.
Tabela "produkty_sklepy" z racji nazwy wygląda na tabelę łącznikową dla relacji n:m, super, ale dlaczego nie ma w tej tabeli pola CENA? Bo właśnie tutaj owa cena znajdować się powinna.
Tabela "promocje" to jest mój faworyt. Promocje są związane z produktem a nie ze sklepem? To jest ciekawe. Bo w takim razie Jeśli mamy w promocjach np.
produkt id = 5, cena 10zł i w dwóch sklepach mamy ten produkt i nawet mamy odpowiednią ilość (po 5 sztuk w każdym) to znaczy ze tak na prawdę można kupić tych produktów 10 po tej promocyjnej cenie? To po coż w ogóle ta ilość?
Na moje oko to promocja powinna łączyć się ze sklepem i chyba lepiej żeby była %, bo mniejsza szansa że sie ktoś pomyli.

0

no widzisz tu się zaczynają schody ;P

po pierwsze to nie moja baza i ona niestety musi zostać taka choćbym nie wiem co

co jeśli w tabeli promocje nie ma produktu który mamy już w naszej wynikowej tabeli do której joinujemy?

A jeśli ich w ogóle w tabeli promocje nie ma to co?

to właśnie działa wstecz, nie ma możliwości by coś było w innej tabeli a nie było w promocjach ;/

tabela produkty zawiera listę produktów
tabela promocji (czy jak wolisz nazwijmy to tabela cen) zawiera wszystkie możliwe opcje cenowe, w zależności do tego jaka ilość jest na stanie w sklepie to taką ma cenę pobieraną z promocji

produkty_sklepy zawiera info w jakim sklepie jest jaka ilość danego towaru

a tabela

0

aaa no to w takim razie to zupełnie inna bajka. Co prawda to jest idiotyczne rozwiązanie, bo jak się okaże że mamy dwa wpisy w tabeli "promocje" gdzie mamy identyczną ilość a różne ceny to co?
Poz tym te "ilości" chcesz traktować przedziałami? Tzn powiedzmy że w sklepie było 5 sztuk. W tabeli promocje masz dla 5 sztuk cenę 10zł. Ktoś kupił 1 sztukę, w sklepie mamy 4, ale w tabeli nie mamy opcji dla 4 sztuk. I teraz mam wybrać tą "najniższą cenę z tabeli promocji"? Co to za bezsens? Czyli że po każdym sprzedanym produkcie sprzedawca musi modyfikować ceny wszystkich produktów które ktoś kupił?
Czy np. w bazie będą dziesiątki duplikatów typu:
id | ilosc | cena
1 1 9 //to jest np. promocyjna cena, jak jest ostatni egzemplarz
1 2 10
1 3 10
1 ..................
1 9999 10
I Teraz masz w bazie 10 tysięcy wpisów tylko po to żeby wszystkie możliwości były rozpatrzone? o_O
Gratuluje geniuszu osobie które to zaprojektowała i pewnie wzięła to za pieniądze ;]

0

no cóż, nie chodzi tu bynajmniej o sensowność ;]

ale coś mi się wydaje że 1 zapytaniem tego nie pociągnę, chyba że procedury składowane, ale to teżmi nie leży

no cóż, dzięki ;] coś wykombinuję innego

1 użytkowników online, w tym zalogowanych: 0, gości: 1