Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zapytanie do trzech tabel
Forum PHP.pl > Forum > Bazy danych > MySQL
gennebis
Mam trzy tabele:

news
- id
- title
- content

tags
- id
- name

news_tags
- news_id
- tags_id

Potrzebuję pobrać jednym zapytaniem z tych trzech tabel w formie:
  1. Array([0] => Array([id] => 1, [title] => Tytuł, [content] => ..., [tags] => Array([0] => nazwa_tagu1, [1] => nazwa_tagu2));


Zrobiłem zapytanie w ten sposób:
  1. SELECT news.id, news.title, tags.name FROM news
  2. LEFT JOIN news_tags
  3. INNER JOIN tags
  4. ON news_tags.news_id = tags.id
  5. ON news_tags.news_id = news.id


Ale otrzymuję wynik:

  1. Array ( [0] => Array ( [id] => 1 [title] => Lorem ipsum sit amet [name] => Lorem ) [1] => Array ( [id] => 1 [title] => Lorem ipsum sit amet [name] => Lorem ) [2] => Array ( [id] => 1 [title] => Lorem ipsum sit amet [name] => Lorem ) )


a nie o to mi chodziło. Proszę o pomoc w łączeniu tabel jestem laikiem :/
nospor
ON ma byc bezposrednio po JOIN NAZWA_TABELI a nie jak to zrobiles teraz na zasadzie nawiasow otwierajacych i zamykajacych.

Po drugie:
musisz te dane obrobic w php i stworzyc tablice jaką chcesz.
Od biedy mozesz pobawic sie z GROUP BY i GROUP_CONCAT.
Obie metody masz opisane tutaj:
http://nospor.pl/grupowanie-wynikow.html
gennebis
Nie chodzi o to bo dane sobie obrobię w php bez problemu, tylko pobiera mi nazwy tagów 3 takie same o powinien 3 inne i nie rozumiem gdzie jest błąd.
nospor
A poprawiles JOINy jak ci napisalem?
gennebis
Ta

  1. SELECT news.id, news.title, tags.name FROM news
  2. LEFT JOIN news_tags ON news_tags.news_id = news.id
  3. INNER JOIN tags ON news_tags.news_id = tags.id
nospor
Kurka... ale patrz co z czym łączysz...
O tu
INNER JOIN tags ON news_tags.news_id = tags.id
masz łączyc tag z tagiem a nie news z tagiem.... to to są rozne id news i tag.
gennebis
A faktycznie.

  1. SELECT news.id, news.title, tags.name FROM news
  2. LEFT JOIN news_tags ON news_tags.news_id = news.id
  3. INNER JOIN tags ON news_tags.tags_id = tags.id


To już działa poprawnie daje taki wynik.

  1. Array ( [0] => Array ( [id] => 1 [title] => Lorem ipsum sit amet [name] => Lorem ) [1] => Array ( [id] => 1 [title] => Lorem ipsum sit amet [name] => Ipsum ) [2] => Array ( [id] => 1 [title] => Lorem ipsum sit amet [name] => Sit ) )


Czyli rozumiem, że nie da się zrobić w ten sposób, że zamiast wybierać każdy news po n razy i na końcu mieć [name] => nazwa_tagu, wybrać każdy news jeden raz i mieć na końcu [tags] => Array([0] => nazwa1, [1] => nazwa2) bez obróbki przez php?
nospor
przeciez pisalem:
Cytat
Od biedy mozesz pobawic sie z GROUP BY i GROUP_CONCAT.
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.