Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Podkręcanie GROUP_CONCAT
TomASS
post
Post #1





Grupa: Zarejestrowani
Postów: 1 660
Pomógł: 13
Dołączył: 9.06.2004
Skąd: Wrocław i okolice

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


Witam serdecznie.

Mam w bazie danych realację jeden do wielu. Mam tabelę transporty oraz miejsca. Do jednego transportu może być przypisanych kilka miejsc.

Aby całość trasy (wszystkie miejsca danego transportu) wyciąnąć w zapytaniu daję GROUP CONCAT:

  1. SELECT T.*, (SELECT GROUP_CONCAT(DISTINCT M.Miejscowosc ORDER BY Rodzaj DESC SEPARATOR '-') FROM m_miejsca AS M WHERE M.ID_transport=T.ID_t AND M.Miejsce!='del') FROM m_transporty AS T;


Niestety daje mi to czas 8 sekund dla 100 rekordow. Po usunieciu GROUP_CONCAT daje mi czas 0,03s.
Co próbowałem:
1. Uproszczenie GROUP_CONCAT: (SELECT GROUP_CONCAT(M.Miejscowosc SEPARATOR '-') FROM m_miejsca AS M WHERE M.ID_transport=T.ID_t ) - nic nie daje (minimalne przyspieszenie - 1,5%)
2. Przeniesienie funkcjonalności do "STORED FUNCTION" - także nic


Czy ktoś ma jakiś pomysł?


--------------------
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
mortus
post
Post #2





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


Nie ma się co dziwić, że zapytanie działa tak długo, ponieważ sprawdza setki kombinacji, zanim trafi na odpowiedni zbiór pogrupowanych miejscowości. Jest po prostu trochę źle napisane:
  1. SELECT T.*,
  2. (
  3. SELECT GROUP_CONCAT(M.Miejscowosc SEPARATOR '-')
  4. FROM m_miejsca AS M
  5. WHERE M.Miejsce != 'del'
  6. GROUP BY M.ID_transport
  7. HAVING M.ID_Transport = T.ID_t
  8. ) AS Miejscowosci FROM m_transporty AS T;

Nie wiem czemu ma służyć sortowanie, ale dopisać nie będzie trudno.

Grupujemy i łączymy tylko te rekordy, których M.ID_transport jest zgodne z T.ID_t.

PS1: Usunąłem część odpowiedzi, bo brzmiała dwuznacznie, tzn. można ją było dwuznacznie zrozumieć.

PS2: Teraz tak patrzę i widzę, że różnica jest niewielka. Zastanawiam się tylko, po co Ci DISTINCT w podzapytaniu i dlaczego te tabele są połączone relacją jeden do wielu. Wydawać by się mogło, że do tego potrzebne są trzy tabele i relacja wiele do wielu, ale to zależy od założeń aplikacji.

Ten post edytował mortus 2.04.2013, 20:33:48
Go to the top of the page
+Quote Post

Posty w temacie


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 Aktualny czas: 20.08.2025 - 05:41