Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: optymalizacja zapytania - typowe tagi
Forum PHP.pl > Forum > Bazy danych > MySQL
minchal
Witam,
mam takie zapytanie. Wyciąga ono listę "czegoś" (w tym przypadku tabela firm) wg. danego tagu, ale dodaje też listę wszystkich tagów danego elementu. Relacja firmy-tagi to typowe wiele do wielu, z tablicą pośrednią (nie znam jeszcze specjalistycznego nazewnictwa winksmiley.jpg ).
  1. SELECT
  2. c.id, c.cat_id, c.name, c.url, c.logo, c.rating, c.special, c.city, c.views,
  3. cc.name AS cat_name, cc.url AS cat_url,
  4. GROUP_CONCAT(DISTINCT t_all.tag SEPARATOR ', ') AS tags
  5. FROM x_company c
  6. LEFT JOIN x_company_category cc ON c.cat_id = cc.id
  7.  
  8. LEFT JOIN x_company_tags ct_all ON ct_all.company_id = c.id
  9. LEFT JOIN x_tags t_all ON ct_all.tag_id = t_all.id
  10.  
  11. LEFT JOIN x_company_tags ct ON ct.company_id = c.id
  12. LEFT JOIN x_tags t ON ct.tag_id = t.id
  13. WHERE t.tag = 'webdesign'
  14.  
  15. GROUP BY c.id

Czy można to zapytanie zoptymalizować? Na razie bazę mam małą, więc wykonuje się szybko, nie wiem jak będzie w przyszłości.
vokiel
Jeśli masz sensownie pozakładane indeksy to można powiedzieć, że jest to bardzo ładne zapytanie smile.gif
minchal
Dzięki za odpowiedź. Masz może jakieś sugestie, co do indeksów?

Poniżej obecna struktura tabel:
  1. CREATE TABLE `x_company` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `cat_id` int(11) NOT NULL,
  4. `user_id` int(11) DEFAULT NULL,
  5. `url` varchar(255) NOT NULL,
  6. (... tutaj jest wiele nieistotnych pól...)
  7. PRIMARY KEY (`id`),
  8. UNIQUE KEY `url` (`url`)
  9. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  10.  
  11. CREATE TABLE `x_company_category` (
  12. `id` int(11) NOT NULL AUTO_INCREMENT,
  13. `name` tinytext NOT NULL,
  14. `url` varchar(255) NOT NULL,
  15. `parent_id` int(11) NOT NULL,
  16. `lft` int(11) NOT NULL,
  17. `rgt` int(11) NOT NULL,
  18. PRIMARY KEY (`id`),
  19. UNIQUE KEY `url` (`url`)
  20. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  21.  
  22. CREATE TABLE `x_company_tags` (
  23. `company_id` int(11) NOT NULL,
  24. `tag_id` int(11) NOT NULL
  25. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  26.  
  27. CREATE TABLE `x_tags` (
  28. `id` int(11) NOT NULL AUTO_INCREMENT,
  29. `tag` tinytext NOT NULL,
  30. PRIMARY KEY (`id`)
  31. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  32.  
vokiel
Dodałbym:
x_company => cat_id
x_company_tags => company_id, tag_id (w tej tabeli co jest kluczem głównym? złączenie obu kolumn?)
x_tags => tag
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.