Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dzielenie kolumny po przecinku
Forum PHP.pl > Forum > Bazy danych > MySQL
MateuszRyaN
Witam, mam pewien problem. Potrzebuje wykonać zapytanie, które sprawdzi, czy podana wartość występuje w określonej komórce.
Próbowałem LIKE jednak to nie jest zbyt dobry wybór, substring_index wyciąga mi określoną pozycje, ale przecież nie wiem ile ich może być, oraz REGEXP np '^5,$' natomiast coś mi nie chce działać sad.gif

id - category
1 - 14,24,5,21
2 - 3,4,13,5
3 - 16,17,22,4,5,8

Potrzebuję zapytania, które wyszuka mi wszystkie rekordy pasujące np. do 5 (1,2,3) lub 4 (2,3).
Prosiłbym o jakąś pomoc, wskazówkę.
Pozdrawiam.
thek
Wiem, że nie jest to odpowiedź, ale patrząc co zawiera druga kolumna, myślę że masz źle zaprojektowaną bazę. Jeśli dochodzi do sytuacji takiej jak opisana, to niemal na pewno da się to zamienić na tabelę łączącą, która powinna Ci o niebo uprościć tego typu problemy.

Co do zapytania, to trudno Ci będzie znaleźć sensowne rozwiązanie tego problemu z prostej przyczyny... Co byś nie wpisał, musisz zwracać uwagę by podana przez Ciebie liczba nie była się częścią innej. Powstają Ci więc 3 warunki ograniczające połączone OR:
^5, <- 5 na początku
,5, <- 5 gdzieś w środku
,5$ <- 5 na końcu

A niestety LIKE i REGEXP do demonów wydajności nie należą... Zwłaszcza w drugim przypadku. LIKE zresztą w Twoim przypadku oleje indeksy, więc o jakimkolwiek przyspieszeniu zapomnij. Lepiej wyjdziesz przebudowując to. Inaczej o jakimkolwiek wygodnym sprawdzani, edytowaniu i manipulacjach wszelakich po stronie bazy zapomnij.
sazian
ewentualnie pole typy SET powinno zadziałać
MateuszRyaN
Dzięki za info, no właśnie próbowałem różnych metod i wiedziałem że są kijowe...sęk w tym że dostałem gotową baze i mam po prostu podpiąć php'a ;/ Wychodzi na to że najlepiej przerobić bazę lub wyciągnąć to co jest i pobawić się po stronie php...
thek
Powiem tak... Przebuduj to, póki jest w miarę małe. Potem gdy się rozrośnie, będzie gorzej i zapewne wokół tego narosną zależności, z którymi się tylko ktoś będzie użerać musiał. Dorzuć tabelę łączącą i nieco przebuduj kod by owe zmiany uwzględnił. Inaczej z biegiem czasu ten fragment zacznie robić za wąskie gardło.
mmmmmmm
Jeśli nie chcesz (nie możesz) przebudować bazy, to możesz zrobić tak:
Na czas porównania dodaj do category na poczętku i na końcu ,. Czyli będziesz miał:
1 - ,14,24,5,21,
2 - ,3,4,13,5,
3 - ,16,17,22,4,5,8,
I teraz tu już LIKE lub REGEX wystarczy...
Czyli:
SELECT * FORM tabela WHERE CONCAT(',', category, ',') LIKE '%,5,%'
Założyłem, że baza MySQL - CONCAT
i złożyłem, że szukasz 5
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.