[mysql] Tabela powiązana sama ze sobą - wiele-do-wiele

0

Witam.

Mam tablice:

Towary:

  • id_towaru
    - reszta nieistotna

Towary_powiazane:

  • id_towaru1
  • id_towaru2

Załóżmy przykładowe wartości:

+-----------+
| id_towaru |
+-----------+
|        1  |
|        2  |
|        3  |
|        4  |
|        5  |
|        6  |
|        7  |
|        8  |
|        9  |
|       10  |
+-----------+
+------------+------------+
| id_towaru1 | id_towaru2 |
+------------+------------+
|         1  |          2 | 
|         1  |          3 |
|         1  |          6 |
|         1  |          9 |
|         4  |          1 |
|         10 |          1 |
+------------+------------+

I teraz - chcę wyciągnąć wszystkie towary, powiązane z towarem 1. Czyli "połączyć" dwa zapytania:
SELECT id_towaru2 from Towary_powiazane WHERE id_towaru1=1
i
SELECT id_towaru1 from Towary_powiazane WHERE id_towaru2=1
Tak, aby odpowiedź na obydwa była zawarta w jednym recordsecie i otrzymać wynik:
2
3
6
7
4
10

Da się to w ogóle zrobić, czy trzeba jednak tworzyć dwa oddzielne zapytania?

0

Słyszałeś o złączeniu UNION ALL?

@down - imho źle.

0

SELECT id_towaru2 from Towary_powiazane WHERE 1 IN (id_towaru1, id_towaru2)

0

Co jest nie tak w UNION?

SELECT id_towaru2 as id_towaru from Towary_powiazane WHERE id_towaru1=1
UNION
SELECT id_towaru1 as id_towaru from Towary_powiazane WHERE id_towaru2=1

Natomiast kod podany przez Marcin.Miga jest oczywiście błędny, gdyż zawsze zwracane jest id_towaru2.

0
__krzysiek85 napisał(a)

Co jest nie tak w UNION?

SELECT id_towaru2 as id_towaru from Towary_powiazane WHERE id_towaru1=1
UNION
SELECT id_towaru1 as id_towaru from Towary_powiazane WHERE id_towaru2=1

Natomiast kod podany przez Marcin.Miga jest oczywiście błędny, gdyż zawsze zwracane jest id_towaru2.

Co jest nie tak w UNION? (MS SQL)

  • Lokowanie tabel z podselectów do czasu zakończenia zapytania.
  • ścisła zgodność typów w obu podzapytaniach
  • niedopasowanie typów (np. pierwszy select zwraca INT, choć pole jest double, bo akurat taki where został nałożony, a drugi zwraca Double, to w koncowym wyniku i tak bedzie Int)
    ...
    Coś tam jeszcze było, ale zapomniałem.
    Powyższe jednak są dość upierdliwe by nie stosować union.
    A moje zapytanie tak naprawdę miało tylko pokazać WHERE - nic więcej. A i zapytanie wykona się jak sądzę dwa razy szybciej (albo więcej, gdyż jeszcze nie będzie robił DISTINCTA).
0

W UNION ALL nie robi distincta...

Jak się UNION nie podoba to można tak:

SELECT CASE WHEN id_towaru1 = 1 THEN id_towaru2 ELSE CASE WHEN id_towaru2 = 1 THEN id_towaru1 END END AS id_towaru
FROM Towary_powiazane 
WHERE id_towaru1 = 1 OR id_towaru2 = 1

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