Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> jak wyrzucic dane z 7 tabel
mika1
post
Post #1





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 15.05.2007

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


Witajcie,

mam baze o strukturze:
  1. CREATE TABLE `umowy` (
  2. `NrUmowy` varchar(10) NOT NULL,
  3. `OpisUmowy` varchar(255) NOT NULL,
  4. `Grupa` varchar(255) NOT NULL,
  5. `Typ` varchar(255) NOT NULL,
  6. `Dzial` varchar(255) NOT NULL,
  7. `Jednostka` varchar(255) DEFAULT NULL,
  8. `Nazwisko` varchar(100) NOT NULL,
  9. `Imie` varchar(50) NOT NULL,
  10. `Poczatek` varchar(12) NOT NULL,
  11. `Koniec` varchar(12) NOT NULL,
  12. `BiezacyRok` varchar(5) NOT NULL,
  13. PRIMARY KEY (`NrUmowy`));
  14.  
  15.  
  16. CREATE TABLE `zlecenie` (
  17. `Lp` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  18. `NrUmowy` varchar(10) NOT NULL,
  19. `Rok` varchar(5) NOT NULL,
  20. `Wykonawca` varchar(255) NOT NULL,
  21. `DataFaktury` varchar(12) NOT NULL,
  22. `NrFaktury` varchar(20) NOT NULL,
  23. `Kwota` double NOT NULL,
  24. PRIMARY KEY (`Lp`));
  25.  
  26. CREATE TABLE `dzielo` (
  27. `Lp` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  28. `NrUmowy` varchar(10) NOT NULL,
  29. `Rok` varchar(5) NOT NULL,
  30. `Nazwisko` varchar(100) NOT NULL,
  31. `Imie` varchar(50) NOT NULL,
  32. `Kwota` double NOT NULL,
  33. PRIMARY KEY (`Lp`));
  34.  
  35. CREATE TABLE `materialy` (
  36. `Lp` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  37. `NrUmowy` varchar(10) NOT NULL,
  38. `Rok` varchar(5) NOT NULL,
  39. `Wykonawca` varchar(255) NOT NULL,
  40. `DataFaktury` varchar(12) NOT NULL,
  41. `NrFaktury` varchar(20) NOT NULL,
  42. `Kwota` double NOT NULL,
  43. PRIMARY KEY (`Lp`));
  44.  
  45. CREATE TABLE `ogolne` (
  46. `Lp` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  47. `NrUmowy` varchar(10) NOT NULL,
  48. `Rok` varchar(5) NOT NULL,
  49. `Data` varchar(12) NOT NULL,
  50. `Kwota` double NOT NULL,
  51. PRIMARY KEY (`Lp`));
  52.  
  53. CREATE TABLE `prow` (
  54. `NrUmowy` varchar(10) NOT NULL,
  55. `Rok` varchar(6) NOT NULL,
  56. `Lacznie` double NOT NULL,
  57. `wyplaty` double NOT NULL,
  58. `zlecenie` double NOT NULL,
  59. `Materialy` double NOT NULL,
  60. `Uslugi` double NOT NULL,
  61. `dzielo` double NOT NULL,
  62. `koszty` double NOT NULL,
  63. `Ogolne` double NOT NULL, `VAT` double NOT NULL
  64. );
  65.  
  66. CREATE TABLE `blokady` (
  67. `Lp` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  68. `NrUmowy` varchar(10) NOT NULL,
  69. `Rok` varchar(5) NOT NULL,
  70. `Data` varchar(12) NOT NULL,
  71. `Kwota` double NOT NULL,
  72. `Cel` varchar(100) NOT NULL,
  73. PRIMARY KEY (`Lp`));
  74.  
  75. CREATE TABLE `uslugi` (
  76. `Lp` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  77. `NrUmowy` varchar(10) NOT NULL,
  78. `Rok` varchar(5) NOT NULL,
  79. `Wykonawca` varchar(255) NOT NULL,
  80. `DataFaktury` varchar(12) NOT NULL,
  81. `NrFaktury` varchar(20) NOT NULL,
  82. `Kwota` double NOT NULL,
  83. PRIMARY KEY (`Lp`));
  84.  
  85. CREATE TABLE `wyplaty` (
  86. `Lp` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  87. `NrUmowy` varchar(10) NOT NULL,
  88. `Rok` varchar(5) NOT NULL,
  89. `Miesiac` varchar(15) NOT NULL,
  90. `Kwota` double NOT NULL,
  91. PRIMARY KEY (`Lp`));
  92.  
  93. CREATE TABLE `koszty` (
  94. `Lp` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  95. `NrUmowy` varchar(10) NOT NULL,
  96. `Rok` varchar(5) NOT NULL,
  97. `Nazwisko` varchar(100) NOT NULL,
  98. `Imie` varchar(50) NOT NULL,
  99. `Kwota` double NOT NULL,
  100. PRIMARY KEY (`Lp`));
  101.  
  102. CREATE TABLE `grupy_umow` (
  103. `NazwaGrupy` varchar(255) NOT NULL,
  104. PRIMARY KEY (`NazwaGrupy`));
  105.  
  106.  
  107. CREATE TABLE `jednostki` (
  108. `NazwaJednostki` varchar(255) NOT NULL,
  109. `NazwaDzialu` varchar(255) NOT NULL,
  110. PRIMARY KEY (`NazwaJednostki`));
  111.  
  112.  
  113. CREATE TABLE `typy_umow` (
  114. `NazwaTypu` varchar(255) NOT NULL,
  115. `NazwaGrupy` varchar(255) NOT NULL,
  116. PRIMARY KEY (`NazwaTypu`));
  117.  
  118.  
  119. CREATE TABLE `Dzialy` (
  120. `NazwaDzialu` varchar(255) NOT NULL,
  121. PRIMARY KEY (`NazwaDzialu`));


i potrzebuje wydobyc dane z 7 tabel. Robie to tak:
  1. SELECT a.NrUmowy, a.Grupa, a.Dzial, a.Nazwisko, b.sum(Kwota), b.Rok, c.sum(Kwota), c.Rok, d.sum(Kwota), d.Rok, e.sum(Kwota), e.Rok, f.sum(Kwota), f.Rok, g.sum(Kwota), g.Rok, m.sum(Kwota), m.Rok
  2. FROM umowy a
  3. LEFT JOIN zlecenie b ON b.NrUmowy = a.NrUmowy
  4. LEFT JOIN dzielo c ON c.NrUmowy = a.NrUmowy
  5. LEFT JOIN materialy d ON d.NrUmowy = a.NrUmowy
  6. LEFT JOIN uslugi e ON e.NrUmowy = a.NrUmowy
  7. LEFT JOIN wyplaty f ON f.NrUmowy = a.NrUmowy
  8. LEFT JOIN koszty g ON g.NrUmowy = a.NrUmowy
  9. LEFT JOIN ogolne m ON m.NrUmowy = a.NrUmowy
  10. GROUP BY b.NrUmowy, b.Rok, c.NrUmowy, c.Rok, d.NrUmowy, d.Rok, e.NrUmowy, e.Rok, f.NrUmowy, f.Rok, g.NrUmowy, g.Rok, m.NrUmowy, m.Rok


Chciałabym dodać jeszcze 2 tabele. Ale na chwilę obecną wydajnościowo działa to tak że po 4 godzinach brak efektu. Co mogę zrobić żeby uzyskać na początek te dane?

Dzięki
B
Go to the top of the page
+Quote Post
mar1aczi
post
Post #2





Grupa: Zarejestrowani
Postów: 731
Pomógł: 141
Dołączył: 9.05.2011
Skąd: śląskie

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


Zacznij od jednej tabeli i dokładaj po jednej sprawdzając wyniki oraz explain - czy czasem nie leci po nieindeksowanych danych.
Go to the top of the page
+Quote Post
kartin
post
Post #3





Grupa: Zarejestrowani
Postów: 246
Pomógł: 79
Dołączył: 25.05.2010

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


Należy zastosować indeksy na kluczach obcych.

Abstrahując od wydajności to należy stosować właściwe typy danych
  1. `Rok` varchar(5) NOT NULL,
  2. `Data` varchar(12) NOT NULL,
  3. `Kwota` double NOT NULL,
O ile przez rok i datą nic złego się nie stanie, to z kwotą w double możesz się przejechać.

  1. SELECT a.NrUmowy, a.Grupa, a.Dzial, a.Nazwisko, b.sum(Kwota), b.Rok, c.sum(Kwota), c.Rok, d.sum(Kwota), d.Rok, e.sum(Kwota), e.Rok, f.sum(Kwota), f.Rok, g.sum(Kwota), g.Rok, m.sum(Kwota), m.Rok
  2. ...
  3. GROUP BY b.NrUmowy, b.Rok, c.NrUmowy, c.Rok, d.NrUmowy, d.Rok, e.NrUmowy, e.Rok, f.NrUmowy, f.Rok, g.NrUmowy, g.Rok, m.NrUmowy, m.Rok
Powinno się grupować po wszystkich kolumnach w których nie są użyte funkcje agregujące. To, że MySQL nie wymusza tego to już inna bajka.

  1. CREATE TABLE `grupy_umow` (
  2. `NazwaGrupy` varchar(255) NOT NULL,
  3. PRIMARY KEY (`NazwaGrupy`));
  4.  
  5. CREATE TABLE `Dzialy` (
  6. `NazwaDzialu` varchar(255) NOT NULL,
  7. PRIMARY KEY (`NazwaDzialu`));
Czemu to ma służyć?

Ten post edytował kartin 15.09.2015, 10:55:14
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #4





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


Zapytanie ogólnie jest do dupy.
1. b.sum(Kwota) nie ma prawa zadziałać.
2. załóżmy, że masz umowę o id=1, do tego masz dwa zlecenia (umowa_id=1), więc robią ci się dwa rekordy z umowa.id=1. Każda dołączona tabela ma już zwielokrotnione rekordy.
3. najbardziej spowalnia LEFT JOIN
4. Zapytanie powinno wyglądać np. mniej więcej tak:
  1. SELECT a.NrUmowy, a.Grupa, a.Dzial, (SELECT Sum(Kwota) FROM zlecenie b WHERE b.NrUmowy=a.NrUmowy), ... FROM umowy a

(oczywiście można to tez inaczej rozwiązać, ale ten sposób jest najbardziej logiczny)
Go to the top of the page
+Quote Post
mika1
post
Post #5





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 15.05.2007

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


Nie mogę zmienić struktury bazy ani typów danych. Dostałam taki twór z którego muszę wyłowić dane. Ktoś kilka lat temu to napisał i tak już jest.
Go to the top of the page
+Quote Post
Pyton_000
post
Post #6





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Pozakładaj Indeksy na kolumnach po których łączysz tabele, bo wg. struktury ich nie masz.
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: 19.09.2025 - 13:18