Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: optymalizacja zapytania
Forum PHP.pl > Forum > Bazy danych > MySQL
jacusek
Witam.
Posiadam dwie tabele w postaci
  1. CREATE TABLE `przychody` (
  2. `id_przych` SMALLINT(6) NOT NULL AUTO_INCREMENT,
  3. `data_przychod` DATE NOT NULL,
  4. `kategoria` VARCHAR(50) NOT NULL COLLATE 'utf8_polish_ci',
  5. `kwota_przychod` DOUBLE NOT NULL,
  6. `kanal` VARCHAR(4) NOT NULL,
  7. PRIMARY KEY (`id_przych`)
  8. )
  9. COLLATE='utf8_general_ci'
  10. ENGINE=InnoDB
  11. ROW_FORMAT=DEFAULT
  12. AUTO_INCREMENT=0

oraz
  1. CREATE TABLE `wydatki` (
  2. `id_wyd` SMALLINT(6) NOT NULL AUTO_INCREMENT,
  3. `data_wydatek` DATE NOT NULL,
  4. `kategoria` VARCHAR(50) NOT NULL COLLATE 'utf8_polish_ci',
  5. `kwota_wydatek` DOUBLE NOT NULL,
  6. `kanal` VARCHAR(4) NOT NULL,
  7. PRIMARY KEY (`id_wyd`)
  8. )
  9. COLLATE='utf8_general_ci'
  10. ENGINE=InnoDB
  11. ROW_FORMAT=DEFAULT
  12. AUTO_INCREMENT=0

Chciałem jakoś inteligentnie połączyć jakoś te table, żebym mógł znajdywać prawidłowość w postaci sumy z wydatków i przychodów z jednego miesiąca.
Jak widać żadna z tabel nie wspólnego id poza polem kanal. Jednak w tym przypadku join nie wchodzi w grę bo kanal to pięć powtarzających się wierszy (sposoby przepływu pieniędzy - karta kredytowa, konto, gotówka, itp...).
Wymyśliłem dość karkołomną konstrukcję:

  1. CREATE TEMPORARY TABLE wydatki1 AS
  2. SELECT DISTINCT(date_format(data_wydatek,'%Y_%m')) AS miesiac, sum(kwota_wydatek) AS wydatki_miesiac FROM wydatki
  3. GROUP BY miesiac;
  4.  
  5. ALTER TABLE wydatki1
  6. ADD INDEX miesiac (miesiac);
  7.  
  8. CREATE TEMPORARY TABLE przychody1 AS
  9. SELECT DISTINCT(date_format(data_przychod,'%Y_%m')) AS miesiac, sum(kwota_przychod) AS przychody_miesiac FROM przychody
  10. GROUP BY miesiac;
  11.  
  12. ALTER TABLE przychody1
  13. ADD INDEX miesiac (miesiac);
  14.  
  15. ----pytanie dotyczące powyższych tabel tymczasowych
  16. SELECT miesiac, przychody_miesiac, wydatki_miesiac FROM wydatki1 JOIN przychody1 USING(miesiac);


No właśnie. Wszytko niby OK, ale:
wydaje mi się, ze z punktu widzenia wydajności to trochę niewygodne i niedobre dla bazy (nie wiem czy nie lepsze byłby widoki w tym przypadku)
i pytanie dodatkowe - korzystając z programów "zewnętrznych" - heidiSQL i mysql Query Browser uruchamiając cały skrypt od razu nie tworzą mi się tabele - tak jakby zamykało się połączenie po pytaniach alter table. Dodam, ze w phpmyadmin pytanie wykonuje się bezproblemowo.
Z góry dzięki za rady
nospor
Zamiast tych dwóch tabel powinna być tylko jedna.
I przychód lub wydatek oznaczałoby -/+ w kwocie, tudzież dodatkowe pole określające czy to przychód czy wydatek
jacusek
Szczerze mówiąc chciałem uniknąć wstawiania ujemnych wartości z powodu większego zachodu przy wstawianiu z poziomu php. Ale skoro twierdzisz, że to lepszy i bardziej optymalny sposób......
Powalczę w takim razie z tej strony smile.gif.
nospor
W tej chwili poprostu masz dwie tabele, które na dobrą sprawę robią to samo.

Co do -/+ to napisałem, ze zamiast tego możesz dodać dodatkowe pole, które będzie określać czy to dochód czy przychód.
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.