Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> optymalizacja zapytania
jacusek
post 15.08.2011, 19:44:29
Post #1





Grupa: Zarejestrowani
Postów: 262
Pomógł: 3
Dołączył: 18.10.2009
Skąd: Łódź

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


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
Go to the top of the page
+Quote Post
nospor
post 15.08.2011, 19:52:25
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
jacusek
post 15.08.2011, 20:01:29
Post #3





Grupa: Zarejestrowani
Postów: 262
Pomógł: 3
Dołączył: 18.10.2009
Skąd: Łódź

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


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.
Go to the top of the page
+Quote Post
nospor
post 15.08.2011, 20:02:52
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 01:43