Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]Pobieranie danych z kilku tabel jednocześnie
Barcelona
post
Post #1





Grupa: Zarejestrowani
Postów: 322
Pomógł: 15
Dołączył: 29.01.2010

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


Witam, opisze swój problem na przykładzie kas w warzywniaku bo za dużo bym miał pisania z tłumaczeniem na czym polega mój projekt.

Otóż w bazie danych mam zrobioną tabele dla każdej kasy. Wszystkich kas jest w sumie 8

Struktura przykładowej kasy:

Kasa_1 {idzakupu, idpracownika, ilosc_zakupow, waga_zakupow, data}

I tak dla każdej kasy.

Mam zrobiony formularz który dodaje te wszystkie dane do poszczególnych kas. Jednak potrzebuje teraz pobrać dane ilosc_zakupow oraz waga_zakupow ze wszystkich kas z jednego konkretnego dnia np. 2011-10-11. Następnie zsumować te wartości (tego dnia kupiono 123 jabłka o wadze 123kg (przy założeniu że jabłko waży 1kg (IMG:style_emoticons/default/smile.gif) ))

Myślałem żeby zrobić to za pomocą jednego zapytania ale zajmowało by kilometr i na dodatek nie ogarniam do końca funkcji JOIN (IMG:style_emoticons/default/sad.gif)

Prosiłbym o pomoc.
Pozdrawiam (IMG:style_emoticons/default/arrowheadsmiley.png)
Go to the top of the page
+Quote Post
mortus
post
Post #2





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


Przykładowa kasa nie umożliwia zapisania co zostało zakupione. Załóżmy, że kasa to:
Kasa_1 { idzakupu, idpracownika, towar, ilosc_zakupow, waga_zakupow, data}
  1. SELECT `towar`, SUM(`ilosc_zakupow`), SUM(`waga_zakupow`) FROM (
  2. SELECT `towar`, `ilosc_zakopow`, `waga_zakupow` FROM `Kasa_1` WHERE `data` = '2011-10-11'
  3. UNION
  4. SELECT `towar`, `ilosc_zakopow`, `waga_zakupow` FROM `Kasa_2` WHERE `data` = '2011-10-11'
  5. UNION
  6. SELECT `towar`, `ilosc_zakopow`, `waga_zakupow` FROM `Kasa_3` WHERE `data` = '2011-10-11'
  7. UNION
  8. SELECT `towar`, `ilosc_zakopow`, `waga_zakupow` FROM `Kasa_4` WHERE `data` = '2011-10-11'
  9. UNION
  10. SELECT `towar`, `ilosc_zakopow`, `waga_zakupow` FROM `Kasa_5` WHERE `data` = '2011-10-11'
  11. UNION
  12. SELECT `towar`, `ilosc_zakopow`, `waga_zakupow` FROM `Kasa_6` WHERE `data` = '2011-10-11'
  13. UNION
  14. SELECT `towar`, `ilosc_zakopow`, `waga_zakupow` FROM `Kasa_7` WHERE `data` = '2011-10-11'
  15. UNION
  16. SELECT `towar`, `ilosc_zakopow`, `waga_zakupow` FROM `Kasa_8` WHERE `data` = '2011-10-11'
  17. ) `zakupy` GROUP BY `towar`


Tylko moim zdaniem cała baza jest skopana.
Go to the top of the page
+Quote Post
max_mcee
post
Post #3





Grupa: Zarejestrowani
Postów: 156
Pomógł: 1
Dołączył: 25.09.2007

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


Nie lepiej zrobić z tego jednej tabeli ?
Potem sumować po dacie i id danej klasy ?
Go to the top of the page
+Quote Post
Barcelona
post
Post #4





Grupa: Zarejestrowani
Postów: 322
Pomógł: 15
Dołączył: 29.01.2010

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


Cytat(mortus @ 20.12.2011, 22:36:03 ) *
Przykładowa kasa nie umożliwia zapisania co zostało zakupione. Załóżmy, że kasa to:
Kasa_1 { idzakupu, idpracownika, towar, ilosc_zakupow, waga_zakupow, data}
  1. SELECT `towar`, SUM(`ilosc_zakupow`), SUM(`waga_zakupow`) FROM (
  2. SELECT `towar`, `ilosc_zakopow`, `waga_zakupow` FROM `Kasa_1` WHERE `data` = '2011-10-11'
  3. UNION
  4. SELECT `towar`, `ilosc_zakopow`, `waga_zakupow` FROM `Kasa_2` WHERE `data` = '2011-10-11'
  5. UNION
  6. SELECT `towar`, `ilosc_zakopow`, `waga_zakupow` FROM `Kasa_3` WHERE `data` = '2011-10-11'
  7. UNION
  8. SELECT `towar`, `ilosc_zakopow`, `waga_zakupow` FROM `Kasa_4` WHERE `data` = '2011-10-11'
  9. UNION
  10. SELECT `towar`, `ilosc_zakopow`, `waga_zakupow` FROM `Kasa_5` WHERE `data` = '2011-10-11'
  11. UNION
  12. SELECT `towar`, `ilosc_zakopow`, `waga_zakupow` FROM `Kasa_6` WHERE `data` = '2011-10-11'
  13. UNION
  14. SELECT `towar`, `ilosc_zakopow`, `waga_zakupow` FROM `Kasa_7` WHERE `data` = '2011-10-11'
  15. UNION
  16. SELECT `towar`, `ilosc_zakopow`, `waga_zakupow` FROM `Kasa_8` WHERE `data` = '2011-10-11'
  17. ) `zakupy` GROUP BY `towar`


Tylko moim zdaniem cała baza jest skopana.


Tak zgadzam się z tym co napisałeś że kasa nie umożliwia zapisania co zostało zapisane, ale nie wypisywałem wszystkich pól z tabeli. Znajdują się tam również towary, oraz inne ważne pola.
Napisałem tutaj, ponieważ chciałem zobaczyć w jaki sposób mogę pobrać przykładowe dane z wielu tabel.

Cytat(max_mcee @ 20.12.2011, 22:40:03 )
Nie lepiej zrobić z tego jednej tabeli ?
Potem sumować po dacie i id danej klasy ?


Teoretycznie tak, ale ostatnio dużo siedziałem nad lekturą Access'a i wyczytałem że lepiej nie pakować wszystkiego do jednego wora, tylko jedną tabele podzielić na kilka i połączyć je relacjami. I tą samą zasadę zastosowałem tutaj.

Ok, daruje sobie przenośnie i napiszę jak faktycznie wygląda moja baza i jak planuje ją "zagospodarować"

CODE
pojemniki {id_pojemnik | nr_pojemnik | waga}
pracownicy {id_pracownik | imie | nazwisko | brygada}
produkcja {id_produkcja | ilosc_szt | ilosc_wg | zmiana | sr_wg_pr | data | braki | braki_pr | brygada}
maszyna1 {id_produkcja | id_pojemnika | id_pracownik | ilosc | waga | zmiana | data | brygada}
.
.
.
maszyna8{j/w}


Jak zauważyliście nie chodzi tutaj o kasy w warzywniaku, tylko o raport produkcyjny.
Na koniec każdej zmiany z każdej maszyny spisuje raport ile i czego zostało wyprodukowane. Te informacje są zapisywane w tabeli odpowiadającej konkretnej maszynie. To mam zrobione.
Następnie muszę pobrać te wartości, zsumować je i robić na nich działania (średnia waga produktu, procent braków itd). Po tych wszystkich obliczeniach chciałbym te dane zapisać w tabeli "produkcja".

Myślę że dzięki temu będę mógł później w łatwy sposób tworzyć raporty z konkretnych dni.

Co to tego kodu powyżej to sprawdze go jutro (tzn dzisiaj (IMG:style_emoticons/default/smile.gif) ) i dam znać jak się sprawdza.

Pozdrawiam
Go to the top of the page
+Quote Post
basstone
post
Post #5





Grupa: Zarejestrowani
Postów: 40
Pomógł: 6
Dołączył: 20.12.2011

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


Może lepiej złącz wszystkie maszyny w jedną tabelę i dodaj do niej kolumnę `id_maszyny` ? Później, gdy będziesz się pytał o konkretnę maszynę dopiszesz tylko do zapytania:

  1. WHERE `maszyna_id`=X
Go to the top of the page
+Quote Post
mortus
post
Post #6





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


@basstone: Lepiej, a nawet bardziej właściwie.

@Barcelona: Chyba źle zrozumiałeś lekturę Access'a. Zauważ, że pomiędzy Twoimi tabelami maszyna1, ..., maszyna8 nie ma żadnej relacji (nie są one ze sobą w żaden sposób powiązane). Zatem nie spełniasz tutaj kryterium, o którym pisałeś, "że lepiej jedną tabele podzielić na kilka i połączyć je relacjami". To co próbujesz tutaj zrobić to "nieco przekombinowana" normalizacja. Normalizacja to jeden z trudniejszych etapów projektowania bazy danych. W sytuacji, którą nam opisałeś jedynym słusznym podejściem jest to zaproponowane przez basstone, choć wydaje mi się, że jeszcze coś będzie nie tak, bo nie znam specyfikacji całego systemu. Jak dla mnie to maszyna produkuje, czyli to co maszyna wyprodukuje powinno być zapisane w tabeli produkcji, natomiast maszyna, to po prostu maszyna. Podsumowując:

Kod
pojemniki {id_pojemnik | nr_pojemnik | waga}
pracownicy {id_pracownik | imie | nazwisko | brygada}
produkty {id_produktu | opis | inne_dane}
produkcja {id_produkcja | id_maszyny | id_produktu | id_pojemnika | id_pracownik | ilosc | waga | zmiana | data | brygada}
maszyny {id_maszyny | opis | inne_dane}

Mając taką bazę danych możesz stworzyć sobie widok, który będzie realizował wszystkie obliczenia w łatwy sposób. Niestety, tak jak pisałem wyżej. Nie znam dokładnej specyfikacji systemu i ciężko mi ocenić, czy można tę bazę danych jeszcze bardziej/lepiej znormalizować.
Go to the top of the page
+Quote Post
Barcelona
post
Post #7





Grupa: Zarejestrowani
Postów: 322
Pomógł: 15
Dołączył: 29.01.2010

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


I chyba od tego będę musiał zacząć, muszę przebudować bazę i poprzerabiać wcześniejsze formularze.
Dzięki za pomoc (IMG:style_emoticons/default/arrowheadsmiley.png)
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 22.08.2025 - 21:58