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

2011-05-30 20:30
edwward
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 ;)

Pozostało 580 znaków

2011-05-30 23:32
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


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij

Pozostało 580 znaków

2011-05-31 00:23
edwward
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?

Pozostało 580 znaków

2011-05-31 00:35
0

SELECT
s. *,
t.tag
FROM

przecież to są podstawy SQLa


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij

Pozostało 580 znaków

2011-05-31 00:36
edwward
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

Pozostało 580 znaków

2011-05-31 07:29
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.

Pozostało 580 znaków

2011-05-31 09:55
edwward
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'

Ok, myślałem, że chodzi o duplikaty w sensie całych wierszy zwracanych przez selecta - źle Cię zrozumiałem. Chyba faktycznie najlepiej w PHP to zrobić. - scovron 2011-05-31 10:28

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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