![]() |
![]() ![]() |
![]() |
![]() ![]()
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ć ![]() 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 |
|
|
![]()
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
|
|
|
![]()
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ć
|
|
|
![]()
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...
|
|
|
![]()
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
|
|
|
![]()
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 |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 23.06.2025 - 11:47 |