Łączenie tabel + LIKE concat

0

Cześć, czy istnieje rozwiązanie mojego problemu od strony mysql?
mam tabele:

tab1(tab1_id,tab1_nazwa) - tabela słownik: przykład
1 | nazwa1
2 | nazwa2
3 | nazwa3

tab2(tab2_id,tab2_id_tab1, tab2_id_nazwa_tab1): przykład:
1 | ;3;1; |
2 | ;1; |

kolumna tab2_id_tab1 to wartości ID tabeli tab1 i teraz chcę otrzymać w kolumnie tab2_id_nazwa_tab1 nazwę odpowiadającą danemu id. Czyli coś takiego:

tab2(id,id_tab1, id_nazwa_tab1): przykład:
1 | ;3;1; | nazwa3, nazwa1
2 | ;1; | nazwa1

Za pomocą LIKE concat('%;', id, ';%') otrzymuje tylko jedną wartość tab1 czyli:

tab2(id,id_tab1, id_nazwa_tab1): przykład:
1 | ;3;1; | nazwa3
2 | ;1; | nazwa1

Jest możliwość użycia jakiejś pętli czy też innego sposobu na rozwiązanie mojego problemu?

2

Korzystając ze sposobu opisanego tu: https://stackoverflow.com/questions/17942508/sql-split-values-to-multiple-rows

Można tak:

select
     tab2_id
      ,GROUP_CONCAT(DISTINCT s.tab1_id
                      ORDER BY s.tab1_id  SEPARATOR ';') tab2_id_tab1
      ,GROUP_CONCAT(DISTINCT tab1_nazwa
                      ORDER BY s.tab1_id  SEPARATOR ';') tab2_id_nazwa_tab1
from (
    SELECT
      tab2.tab2_id,
      SUBSTRING_INDEX(SUBSTRING_INDEX(tab2.tab2_id_tab1, ';', numbers.n), ';', -1) tab1_id
    FROM
      numbers INNER JOIN tab2
      ON CHAR_LENGTH(tab2.tab2_id_tab1)
         -CHAR_LENGTH(REPLACE(tab2.tab2_id_tab1, ';', ''))>=numbers.n-1
    ) s inner join tab1 on tab1.tab1_id=s.tab1_id
group by
   tab2_id

http://sqlfiddle.com/#!9/be84ee/10

0

@Marcin.Miga: Też zastanawiałem się na instr, ale założyłem, ze kolejności id w tab2_id_tab1 ma odpowiadać kolejności w tab2_id_nazwa_tab1, a tego używając instr nie osiągniesz.

Tylko zastanawia mnie czemu Twój przykład: zwraca nazwa1,,nazwa3, dla ;3;1; skoro sam join zwraca dwie wartości a funkcja GROUP_CONCAT ewidentnie skleja 3 w tym jedna "pustą". Sprawdziłem na swoim mysql czy to nie jakieś przekłamanie fiddle ale wynik jest ten sam...

0

Wielkie dzięki za szybką pomoc. Aż się dziwie że mnie zrozumieliście :)

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