Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: jak wyrzucic dane z 7 tabel
Forum PHP.pl > Forum > Bazy danych > MySQL
mika1
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
mar1aczi
Zacznij od jednej tabeli i dokładaj po jednej sprawdzając wyniki oraz explain - czy czasem nie leci po nieindeksowanych danych.
kartin
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ć?
mmmmmmm
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)
mika1
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.
Pyton_000
Pozakładaj Indeksy na kolumnach po których łączysz tabele, bo wg. struktury ich nie masz.
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.