Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: sql czy można to zapytanie przyśpieszyc
Forum PHP.pl > Forum > Bazy danych
jagwie
Witam posiadam poniższe zapytanie czy można to zapytanie przyśpieszyć .
w tym zapytaniu GROUP BY segreguje alfabetycznie miasta a potrzebuje aby segregowało według "COUNT(miasto) as liczba_obiektow" czyli od największej ilości obiektów w bazie
  1. SELECT COUNT(miasto) AS liczba_obiektow,id_miasta, miasto, powiat,region
  2. FROM oferty INNER JOIN miasta
  3. ON oferty.miasto = miasta.nazwa_miasta GROUP BY miasto
  4. HAVING region IN (12,11,14,15,17,18,19,70,20,21,22,23,24,25,27,28,30,32,31,48,68) LIMIT 5
wookieb
Wywal having i warunek stamtąd przenieś do WHERE
Poza tym bez struktury tabeli (SHOW CREATE TABLE) nie za bardzo można więcej powiedzieć.
Crozin
A czy nie mógłbyś tej liczby (liczba_obeitków) trzymać w formie statycznej w bazie danych (w dodatkowej kolumnie) i przy dodaniu/usunięciu rekordu z drugiej tabeli inkrementować/dekrementować tą wartość? Pozbyłbyś się całego COUNT().
jagwie
Z WHERE działa zdecydowanie szybciej

  1. SELECT COUNT( miasto ) AS liczba_obiektow, id_miasta, miasto, powiat, region
  2. FROM oferty
  3. INNER JOIN miasta ON oferty.miasto = miasta.nazwa_miasta
  4. WHERE region
  5. IN ( 12, 11, 14, 15, 17, 18, 19, 70, 20, 21, 22, 23, 24, 25, 27, 28, 30, 32, 31, 48, 68 )
  6. GROUP BY miasto
  7. LIMIT 5


A jeśli chodzi o strukturę tabeli to
tabela "Oferty " - miasto - region
tabela "Miasta" - id_miasta -powiat - nazwa_miasta

Cytat
A czy nie mógłbyś tej liczby (liczba_obeitków) trzymać w formie statycznej w bazie danych (w dodatkowej kolumnie) i przy dodaniu/usunięciu rekordu z drugiej tabeli inkrementować/dekrementować tą wartość? Pozbyłbyś się całego COUNT().


Na pewno byłaby taka możliwość liczba zmienia sie w czasie i musiałbym dopisać jakiś skrypcik w php aby odczytywał aktualny stan i zapisywał jako statycznną liczbę.
Chyba że jest jakiś inny sposób zliczania według ilości ofert w danej chwili.
Wolałbym wykombinować coś w zapytaniu
Crozin
Wystarczy utworzyć TRIGGER który zwiększy wartość o jeden przy dodawaniu, zmiejszy o jeden przy usuwaniu i ewentualnie jeszcze jeden by przy aktualizacji zmieniającej przynależność zmniejszyć o jeden w starym i zwiększyć o jeden w nowym.

To Ci najbardziej przyspieszy zapytanie bo wyeliminujesz zarówno COUNT() jak i GROUP BY.
jagwie
Dzięki za podpowiedz lecz nie wiem jak napisać taki trigger.
I nie wiem czy trigger musi zapisywać w tej tabeli w której te dane są wyciągane .
Chodzi mi o to że z tabeli "Oferty" można pobrać te dane ale nie da rady tam dodać kolumny Ilość ofert.
W drugiej tabeli " Miasta" natomiast występują takie same nazwy miast lecz z innego regionu i również taka kolumna jest wykluczona .


Po prostu nigdy nie interesowałem się triggerem i nie orientuję się jak to działa będę musiał coś o tym poczytać .
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.