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

SELECT z dwóch tabel, jak połączyć zapytania?
  • Rejestracja: dni
  • Ostatnio: dni
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:

Kopiuj
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)

Kopiuj
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 ;)

Misiekd
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 7923
0

a to nie działa?

Kopiuj
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

  • Rejestracja: dni
  • Ostatnio: dni
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?

Misiekd
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 7923
0

SELECT
s. *,
t.tag
FROM

przecież to są podstawy SQLa

  • Rejestracja: dni
  • Ostatnio: dni
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.

Kopiuj
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
scovron
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 27
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:

Kopiuj
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.

  • Rejestracja: dni
  • Ostatnio: dni
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'

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.