Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Pobieranie danych z kilku tabel jednocześnie
Forum PHP.pl > Forum > Przedszkole
Barcelona
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 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 sad.gif

Prosiłbym o pomoc.
Pozdrawiam arrowheadsmiley.png
mortus
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.
max_mcee
Nie lepiej zrobić z tego jednej tabeli ?
Potem sumować po dacie i id danej klasy ?
Barcelona
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 smile.gif) i dam znać jak się sprawdza.

Pozdrawiam
basstone
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
mortus
@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ć.
Barcelona
I chyba od tego będę musiał zacząć, muszę przebudować bazę i poprzerabiać wcześniejsze formularze.
Dzięki za pomoc arrowheadsmiley.png
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.