Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysql] - stan magazynowy, dane z dwóch tabel.
Forum PHP.pl > Forum > Bazy danych > MySQL
Cienki1980
Mam taki mały problem. W dwóch tabelach są przechowywane dane na temat zamówionych towarów ( ilość towaru jest najbardziej interesująca ) i dane dotyczące ile danego towaru zostało kupionego.

Problem mam z zapytaniem, które by wyciągneło dane na temat produktu, ilości w magazynie ( wszystkie dostawy ) oraz ilość kupionych towarów.
  1. CREATE TABLE `towardostawa` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `id_towar` int(11) NOT NULL DEFAULT '0',
  4. `ilosc` int(11) NOT NULL DEFAULT '0',
  5. `nazwa` text,
  6. PRIMARY KEY (`id`)
  7. ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;
  8.  
  9.  
  10. INSERT INTO `towardostawa` VALUES (1, 1, 10, 'jogurt');
  11. INSERT INTO `towardostawa` VALUES (2, 1, 20, 'jogurt');
  12. INSERT INTO `towardostawa` VALUES (3, 2, 3, NULL);
  13. INSERT INTO `towardostawa` VALUES (4, 3, 4, NULL);
  14. INSERT INTO `towardostawa` VALUES (5, 3, 5, NULL);
  15. INSERT INTO `towardostawa` VALUES (6, 5, 10, NULL);
  16. INSERT INTO `towardostawa` VALUES (7, 2, 3, NULL);
  17. INSERT INTO `towardostawa` VALUES (8, 4, 7, NULL);
  18.  
  19.  
  20. CREATE TABLE `zakupy` (
  21. `id` int(11) NOT NULL AUTO_INCREMENT,
  22. `id_towar` int(11) NOT NULL DEFAULT '0',
  23. `ilosc` int(11) NOT NULL DEFAULT '0',
  24. PRIMARY KEY (`id`)
  25. ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;
  26.  
  27. INSERT INTO `zakupy` VALUES (1, 2, 3);
  28. INSERT INTO `zakupy` VALUES (2, 4, 1);
  29. INSERT INTO `zakupy` VALUES (3, 3, 1);
  30. INSERT INTO `zakupy` VALUES (4, 1, 5);
  31. INSERT INTO `zakupy` VALUES (5, 1, 3);


To są przykładowe dane ale bardziej chodzi o samą koncepcje.

W zapytaniu jest jeden problem natomiast, jeżeli towar występuje dwa razy w tabeli "towardostawa" to jest dwa razy sumowana ilość kupiona przez klienta.
  1. SELECT DISTINCT t.id_towar,sum(t.ilosc),sum(z.ilosc)
  2. FROM towardostawa t LEFT JOIN zakupy z ON t.id_towar=z.id_towar GROUP BY t.id_towar

Może ktoś ma jakiś pomysł jak wyciągnąć poprawne dane.
spryciula
dodaj do tabeli, identyfikator klienta i datę zamówienia, to pozwoli ci, wyciągać dane dotyczące interesującego Cię klienta i daty zakupy
Cienki1980
To co pokazałem to tylko fragment tabel, ale ten który zawiera najważniejsze dane. Mnie nie interesuje konkretny klient ... a tym bardziej data kiedy coś kupił.
Tylko i wyłącznie ile towaru było w sumie w magazynie i ile zostało kupione.
spryciula
  1. SELECT xxx.towar, xxx.ilosc_td, sum(z.ilosc)
  2. FROM (SELECT td.id_towar towar, sum(td.ilosc) ilosc_td
  3. FROM towardostawa td
  4. GROUP BY td.id_towar)xxx LEFT JOIN zakupy z
  5. ON xxx.towar = z.id_towar
  6. GROUP BY z.id_towar


chyba o to ci chodziło snitch.gif


tak, będzie lepiej
  1. SELECT xxx.towar, xxx.ilosc_td, sum(ifnull(z.ilosc,0))
  2. FROM (SELECT td.id_towar towar, sum(ifnull(td.ilosc,0)) ilosc_td
  3. FROM towardostawa td
  4. GROUP BY td.id_towar)xxx LEFT JOIN zakupy z
  5. ON xxx.towar = z.id_towar
  6. GROUP BY z.id_towar
Cienki1980
Bangla. Dzięki wielkie.
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.