2013-05-25 14 views
5

Mam tabelę zawierającą następujące wartości:MySql REGEXP dopasować dwie oddzielone przecinkami ciągi

id | value  | 
----------------------- 
1  | 1,2,5,8,12,20 |  
2  | 11,25,26,28 |  
----------------------- 

teraz chcę szukać jakiś oddzielonych przecinkami identyfikatorów np "1,3,6,7,11" z kolumny powyżej wartości np.

SELECT id FROM tbl_name 
WHERE value REGEXP '*some reg exp goes here containing 1,3,6,7,11*' 
LIMIT 1,0; 

SELECT id FROM tbl_name 
WHERE value REGEXP '*some reg exp goes here containing 3,6,27,15*' 
LIMIT 1,0; 

powyżej 1. zapytania powinien powrócić 1 a 2. Należy zwrócić NULL

Jestem nowy z wyrażeń regularnych może ktoś pomóc. Dzięki

+0

Wystarczy, aby upewnić się, że rozumiem, powinna ona powrócić '1 ', ponieważ przynajmniej jedna z liczb mecze w wierszu z tym id? –

+0

Tak jak na marginesie, nie oczekuj dobrej wydajności z zapytania używającego tego formatu danych, nie będzie on mógł korzystać z żadnej postaci indeksów i zawsze będzie musiał przeczytać całą tabelę, aby odpowiedzieć na zapytanie. Innymi słowy, nie nadaje się do renderowania strony internetowej w czasie rzeczywistym, jeśli jest więcej niż kilkaset wierszy danych. –

+0

Nie powinien to być identyfikator tego wiersza, i tak, jeśli przynajmniej jeden z numerów pasuje. – prashant

Odpowiedz

13
REGEXP '(^|,)(1|3|6|7|11)(,|$)' 

Spełnia wszystkie wartości zawierające jeden numer sekwencji 1,3,6,7,11.

Nie należy używać jednej kolumny do zapisania kilku wartości. Normalizuj dane!

Zmieniano odpowiedź

+0

dzięki @Michel, ale chcę dopasować, jeśli którykolwiek z numerów (przynajmniej jeden) w dostarczonym ciągu pasuje do wartości, tak jak w moim pytaniu 1 dopasowuje pierwszy ciąg i wartość. – prashant

+0

Zaktualizowana odpowiedź. Co oznaczają te wartości? To zapytanie zajmie więcej czasu wraz z rosnącymi wartościami długości i rozmiarem tabeli. Mogę pomóc ci wypracować normalizację, jeśli chcesz –

+0

+1 Właściwie to lubię to rozwiązanie lepiej niż moje :) –

Powiązane problemy