Szukanie jakiegokolwiek elementu listy w liście

0

Mam w bazie w jednej z kolumn wartości w wierszu w postaci:
id | numbers
1 | 1,2,3,4,8,9
2 | 3,6,9
3 | 1,2,8

I teraz podając parametr w metodzie List<Integer> numbers
chciałbym odnaleźć wszystkie które zawierają :numbers
czyli jak w :numbers podam np. 1,7 to zwróci mi wyniki z id 1 i id 3 a jak podam w :numbers np. tylko 6 to zwróci tylko wynik z id 2 itd.
jednym słowem szukanie jakiegokolwiek elementu listy w liście :)

0

Rozumiem, że coś tam zrobiłeś już?
Skoro bawisz się w Springa i JPA, to chyba ogarniasz pętle FOR/FOR EACH?
Pokaż swoje rozwiązanie na pętlach:

  • przechodzisz po obiektach pobranych z bazy indeks po indeksie,
  • dobierasz się do listy numbers i tutaj tworzysz drugą pętlę
  • w nowej pętli (od 0 do wielkości tablicy która jest parametrem metody) sprawdzasz czy numerek z parametru metody zawiera się w twoim obiekcie pobranym z bazy.

Jak zrobisz to na pętlach to potem Ci pokażemy krótsze rozwiązanie :)

Gotowca bez pracy własnej nie otrzymasz.

0

@kixe52: w pętli to sobie zrobie bez problemu, chodzi mi o to czy da się za pomocą query zrobić - próbowałem z LIKE z IN oraz z REGEX i FIND_IN_SET ale żadno nie worka jakbym chciał

1

Zapomnij. Jakbyś chociaż to miał tam wrzucone jako jakiegoś JSONa to niektóre bazy mają bieda-wsparcie. Albo jakbyś zamiast MySQL używał jakieś bazy dokumentowej i miał tam listę i mógł na niej zrobić jakieś unnest. Ale skoro masz tam goły SQL to błąd polega na tym, ze masz zdenormalizowaną tabelę. Interesują cię poszczególne wartości a masz je wrzucone jako jednego sklejonego stringa. Jakbyś miał tam normalnie N:M z tabelą łącznikową to mógłbyś to opędzić zwykłym SQLem.

3

Gdyby to był PostgreSQL to można by zrobić:

SELECT id, regexp_split_to_table(numbers, ',') as splitted_numbers
FROM my_table;

A na potrzeby JPA utworzyć nawet widok:

CREATE OR REPLACE VIEW my_view AS
SELECT id, regexp_split_to_table(numbers, ',') as splitted_numbers
  FROM my_table;

Ostatnio coś takiego musiałem robić nawet i działa

Ale że to MySQL to ludzie rzeźbią jakieś cuda jak:

select id, substring_index(substring_index(numbers, ',', n),',',-1) as numbers
  from my_table 
  join my_table on char_length(numbers) - char_length(replace(numbers, ',', '')) >= n - 1;

źródło

2

Twoim podstawowym problemem jest źle zaprojektowana struktura relacji. Pole numbers przechowuje więcej niż jedną informację. Jak masz wyrzeźbioną strukturę, to musisz rzeźbić z zapytaniami.
Za Wikipedią, 1NF

Pierwsza postać normalna (1NF)
Relacja jest w pierwszej postaci normalnej, jeśli:
(...)

  • wartości atrybutów są elementarne (atomowe, niepodzielne) – każda kolumna jest wartością skalarną (atomową), a nie macierzą lub listą czy też czymkolwiek, co posiada własną strukturę,
0

Dla każdej szukanej liczby N są raptem 4 przypadki (zakładając brak spacji):

  • ='N'
  • LIKE 'N,%'
  • LIKE '%,N,%'
  • LIKE '%,N'

Wystarczy złączyć alternatywą logiczną (4 * OR per liczba, niestety SQL puchnie) i powinno jakoś tam działać.

Alternatywnie, gdyby napis zawsze się rozpoczynał od przecinka i kończył przecinkiem to masz jeden przypadek. Może wtedy CONCAT(',',pole,',') LIKE będzie wydajniejsze, o ile nie można po prostu zaktualizować rekordów i algorytmu ich wypełniania.

0

Ciekawe jaki obiekt JPA dał taki zrzut do bazy

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