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
TomASS
post
Post #2





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

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


Zmieniłem - teraz działa 16 sekund :/

Dokładnie to wygląda teraz tak:

  1. SELECT DISTINCT
  2. T.Numer, T.Numer_zleceniodawcy, Zlecniodawca.Nazwa, T.ID_przewoznik,
  3. Przewoznik.Nazwa, 1, Odleglosc, ROUND(T.Cena_jednostkowa_netto_od_sprzedawcy*T.Ilosc,2),
  4. T.Waluta_zlecenia, ROUND(T.Cena_netto_dla_przewoznika,2), T.Waluta_dla_przewoznika,
  5. T.Towar, CONCAT_WS(' ',Kierowca.Nazwisko, Kierowca.Imie), Kierowca_spedycja,
  6. Ciezarowka.Numer_ciagnika, Ciezarowka_spedycja, Faktura.Numer, DATE(T.Data_realizacjiPoczatek),
  7. DATE(T.Data_realizacjiKoniec), Rodzaj_transportu, T.ID_t, Oddzial.Nazwa, ' ', NumerFakturyOdPrzewoznika, T.FakturaObca,
  8. (SELECT GROUP_CONCAT(M.Miejscowosc ORDER BY Rodzaj DESC SEPARATOR '-')
  9. FROM m_miejsca AS M
  10. WHERE M.Miejsce != 'del' AND M.ID_Transport = T.ID_t
  11. GROUP BY M.ID_transport)
  12. FROM
  13. m_transporty AS T LEFT JOIN
  14. m_kontrahenci AS Zlecniodawca ON (Zlecniodawca.ID_k=T.ID_platnik) LEFT JOIN
  15. m_kontrahenci AS Przewoznik ON (Przewoznik.ID_k=T.ID_przewoznik) LEFT JOIN
  16. m_kierowcy AS Kierowca ON (Kierowca.ID_k=T.ID_kierowca) LEFT JOIN
  17. m_ciezarowki AS Ciezarowka ON (Ciezarowka.ID_c=T.ID_ciezarowka) LEFT JOIN
  18. f_faktury AS Faktura ON (Faktura.ID_f=T.ID_faktura) LEFT JOIN
  19. m_oddzialy AS Oddzial ON (Oddzial.ID_o=T.ID_oddzial)
  20. WHERE
  21. T.Miejsce!='del' AND
  22. 1 AND
  23. WEEK(T.Data_realizacjiPoczatek)='2' AND
  24. YEAR(T.Data_realizacjiPoczatek)='2013'
  25. ORDER BY T.Numer ASC


Przeniosłem "M.ID_Transport = T.ID_t" z HAVING do WHERE i jest lepiej - 4sekundy, ale nadal kiepsko :/

Ten post edytował TomASS 2.04.2013, 20:41:32


--------------------
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: 21.08.2025 - 02:15