Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL]Tagi GROUP_CONCAT
Forum PHP.pl > Forum > Przedszkole
Eagle
Witam

Potrzebuje przypisać do każdego newsa jakiś tag np. kraj, php, czerwony etc.
Zrobiłem tabele dla newsów, nazwy tagów i połączenia news<->tag

Kod
       News:
        news_id - id newsa
        news_text - jakiś tekst
        inne rzeczy
        
        Tag:
        tag_id - id konkretnego tagu
        tag_name - nazwa tagu
        
        Polaczenie:
        tag_id - id tagu
        news_id - id newsa


Aby pobrać tagi dla jednego newsa (wraz ze wszystkimi informacjami w newsie news_text, news_date) używam 2 zapytań.
1 - do pobrania informacji o newsie
2 - aby przypisać tagi.

Jednak jak ułożyć zapytanie / zoptymalizować to wszystko przy wyświetlaniu 50newsów ?
Bo wykonanie 101 zapytań dla takiego czegoś to przesada...

Pozdrawiam.
piotrooo89
  1. SELECT * FROM news, tag, polaczenie WHERE polaczenie.tag_id=tag.tag_id AND polaczenie.news_id=news.naws_id


coś takiego?

jeśli by nie chciało chodzić dodaj aliasy dla kolumn które mają tę samą nazwę w dwóch tabelach.
Eagle
Nie, nie o takie coś mi chodziło winksmiley.jpg
To zwraca wszystkie dane newsa tyle razy ile ma przypisanych tagów.

Jeżeli chce wyświetlić konkretnego newsa to wykonuje do niego zapytanie
  1. SELECT * FROM `news` WHERE `news_id` = $newsId

Do tej tablicy która się utworzy z pól z bazy wstawiam dodatkową z tagami:
  1. SELECT `polaczenie`.`tag_id` , `tag`.`tag_name` FROM `polaczenie` LEFT JOIN `tag` ON (`tag`.`tag_id` = `artist_genre`.`tag_id`) WHERE `polaczenie`.`news_id` =$newsId"

I w ten sposób mam wszystko czego potrzebuje winksmiley.jpg

Jednak gdy wyświetlam ostatnie newsy (np. 50)
to zamiast jednego zapytania
  1. SELECT * FROM `news` ORDER BY `data` LIMIT 50
muszę wykonać ich aż 100 (dla każdego newsa 2 zapytania).

I szukam jakiegoś lepszego rozwiązania tego problemu smile.gif (oczywiście może być inna struktura).

Myślałem o dodatkowej tabeli `news_temp` gdzie bym przechowywał ID newsa oraz tablicę tagów.
Jednak to się zbyt szybko rozrośnie

Edit:
Szukając natrafiłem na funkcję (MySQLa) concat_ws
Jednak nie mam pomysłu jak utworzyć zapytanie aby połączyło wszystkie wyniki w zapytaniu.

Edit2:
Znalazłem! smile.gif
  1. SELECT `post` . * , GROUP_CONCAT( `tag`.`tag_name`
  2. ORDER BY `tag`.`tag_name`
  3. SEPARATOR ";" ) AS `tags`
  4. FROM `post` LEFT JOIN `polaczenie` ON `polaczenie`.`p_id` = `post`.`p_id`
  5. LEFT JOIN `tag` ON `tag`.`tag_id` = `polaczenie`.`tag_id`
  6. GROUP BY `post`.`p_id`


Zapytanie zwróci dodatkowe pole `tags` w którym będą podane taki odseparowanie od siebie ';'
Np:
Kod
news_id | news_text | tags
1       | text      | świat;pogoda


Nazwy tabeli i pól mogą troszkę się nie zgadzać ale mam nadzieje że się połapią osoby potrzebujące winksmiley.jpg
Dobranoc
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.