SELECT z dwóch tabel, jak połączyć zapytania?

0

3 tabele

  1. spis: id, nazwa, opis
  2. tag: id, tag
  3. relacja: id_spis,id_tag

Poszczególne spisy wywołuję za pomocą wczytanych id tagów:

SELECT s. *
FROM spis s
WHERE s.id
IN (
   SELECT x.id_spis
   FROM tag t, relacja x
   WHERE t.id
   IN ($tagi)
   AND x.id_tag = t.id
)

Tym sposobem mogę wybrać tagi w zależności od ustalonego id spisu (=1)

SELECT t.tag
FROM tag t
WHERE t.id IN (
   SELECT x.id_tag
   FROM relacja x
   WHERE x.id_spis IN (
      SELECT s.id 
      FROM spis s
      WHERE s.id='1'
   )
)

W jaki sposób można zmodyfikować pierwsze wczytywanie, bym mógł wczytać oprócz s.* także t.tag?
Problem mam z tym, że dla jednego id ze spisu może być wiele tagów. Jak to zrobić, czego szukać?
Potrzebuję do wypisania w xmlu czegoś na wzór: id="1",nazwa="spis1",opis="to jest spis pierwszy",tagi="tag1,tag2,tag3"
Wypisanie do xmla ładnie działa, poza tymi tagami.

Będę bardzo wdzięczny za pomoc ;)

0

a to nie działa?

SELECT 
  s. *
FROM 
  spis s,
  tag t, 
  relacja x
WHERE 
  s.id = x.id
  AND t.id in ($tagi)
  AND x.id_tag = t.id

IN używaj tylko wtedy kiedy nie masz innej możliwości albo zbiór jest mały

0

Działa, w ten sam w sumie sposób co mój pierwszy select. Nie rozwiązuje natomiast problemu, bo zwraca tylko zawartość tabeli spis, a potrzebuję, żeby zwrócił także nazwę tagu z tabeli tag.
Dzięki za odpowiedź, mógłbyś zerknąć jak wyciągnąć tego taga?

0

SELECT
s. *,
t.tag
FROM

przecież to są podstawy SQLa

0

Wystarczyło dodać t.tag do SELECT do Twojego kodu. Pozostaje w phpie usunąć duplikaty i złączyć tagi w całość.
Dzięki wielkie za pomoc. Załączam działający kod.

SELECT 
  s. *,t.tag
FROM 
  spis s,
  tag t, 
  relacja x
WHERE 
  s.id = x.id
  AND t.id IN ($tagi)
  AND x.id_tag = t.id
1
edwward napisał(a)

Wystarczyło dodać t.tag do SELECT do Twojego kodu. Pozostaje w phpie usunąć duplikaty i złączyć tagi w całość.

Zamiast kombinować w PHP użyj distincta:

SELECT DISTINCT
  s. *,t.tag
FROM 
  spis s,
  tag t, 
  relacja x
WHERE 
  s.id = x.id
  AND t.id IN ($tagi)
  AND x.id_tag = t.id

Co rozumiesz pod pojęciem "złączyć tagi w całość"? Może też lepiej byłoby to zrobić SQLem.

0

Pod pojęciem duplikaty miałem na myśli złączenie w jedno np dwóch takich wyników:
id='1',spis='spis1',opis='opis pierwszy',tag='tag1'
id='1',spis='spis1',opis='opis pierwszy',tag='tag2'
W phpie sprawdzę po takim samym id i tagi złączę przecinkiem. Distinctem chyba tego nie załatwię ;)
id='1',spis='spis1',opis='opis pierwszy',tag='tag1,tag2'

1 użytkowników online, w tym zalogowanych: 0, gości: 1