Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Dzielenie kolumny po przecinku, LIKE,REGEXP,substring_index ? A może jeszcze inaczej?
MateuszRyaN
post 10.11.2012, 22:07:55
Post #1





Grupa: Zarejestrowani
Postów: 84
Pomógł: 0
Dołączył: 10.11.2010
Skąd: Jastrzębie Zdrój

Ostrzeżenie: (0%)
-----


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.

Ten post edytował MateuszRyaN 10.11.2012, 22:09:14
Go to the top of the page
+Quote Post
thek
post 10.11.2012, 22:48:23
Post #2





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
sazian
post 10.11.2012, 22:59:47
Post #3





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 141
Dołączył: 19.09.2006
Skąd: B-tów

Ostrzeżenie: (0%)
-----


ewentualnie pole typy SET powinno zadziałać
Go to the top of the page
+Quote Post
MateuszRyaN
post 10.11.2012, 23:18:39
Post #4





Grupa: Zarejestrowani
Postów: 84
Pomógł: 0
Dołączył: 10.11.2010
Skąd: Jastrzębie Zdrój

Ostrzeżenie: (0%)
-----


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...
Go to the top of the page
+Quote Post
thek
post 10.11.2012, 23:26:53
Post #5





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
mmmmmmm
post 11.11.2012, 00:48:35
Post #6





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

Ostrzeżenie: (0%)
-----


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

Ten post edytował mmmmmmm 11.11.2012, 00:49:28
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 23.06.2025 - 11:47