Mam dwa stoły

books_tbl :

blocks  side-bar   top-bar
 23,45   3,15      11,56

strony_tbl :

id title
1  ff
3
11
15

Chcę wybrać wiersze z pages_tbl, gdzie identyfikator stron obejmował bloki, barki boczne lub tob-barowe w books_table.

Jak to przetworzyć?

0
Sanduni Di 15 luty 2017, 19:23

2 odpowiedzi

Najlepsza odpowiedź

Zwykle nie jest to dobry pomysł, aby przechowywać wartości oddzielone przecinkami w jednym polu. Jeśli naprawdę nie możesz zmienić struktury danych, możesz użyć takiego zapytania:

select p.id, p.title
from
  pages_tbl p inner join books_tbl b
  on (
    find_in_set(p.id, b.blocks)
    or find_in_set(p.id, b.side-bar)
    or find_in_set(p.id, b.top-bar)
  )
-- add where condition?
group by p.id, p.title
1
fthiella 15 luty 2017, 16:37

Powinieneś naprawdę rozważyć ustalenie struktury stołu. Nigdy nie przechowywać wielu wartości w jednej komórce. Zobacz normalizację.

Jak w tym przypadku nie możesz, spróbuj użyć funkcji find_in_set.

select
from pages_tbl p
where exists (
    select 1
    from books_tbl b
    where find_in_set(
        p.id, 
        concat(b.blocks, ',', b.side_bar, ',', b.top_bar)
        ) > 0
);

Pamiętaj, że ta będzie być wolna, ponieważ serwer nie może używać indeksu, jeśli istnieje.

1
Gurwinder Singh 15 luty 2017, 16:37