Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyszukanie fraz z jednej kolumny
Forum PHP.pl > Forum > Bazy danych > MySQL
barthezpl
Witam.
Posiadam formularz wyszukiwania, który przeszukuje kolumnę uprawienia, i wyświetla osoby wyszukane poprzez zapytanie., które spełniają warunek np: like 'a1b'
id(pk) pesel kod_upr
1 111 a1
2 222 b1
3 333 c1
4 111 b1a
5 111 c1
6 222 a1b
  1. SELECT DISTINCT (w.pesel), w.name, w.surname, w.city, w.adddate, w.tel1, w.tel1date,
  2. w.wascalled, w.jobstart, w.jobend
  3. FROM workers w
  4. INNER JOIN workers_privilages wp USING (pesel)
  5. WHERE wp.shortname LIKE :parameter1


Teraz chciałbym rozbudować zapytanie które wyłapie mi wszystkie osoby, które posiadają kod_upr like'a1b' and like 'b%'
Niestety nie mogę poradzic sobie z tym zapytaniem
wiiir
patrzac na to:
1 111 a1
2 222 b1
3 333 c1
4 111 b1a
5 111 c1
6 222 a1b

nikt nie posiada takich uprawnien, czyli kod_upr rownemu 'a1b' oraz dodatkowo kod_upr zaczynajacego sie od 'b' w tym samym rekordzie smile.gif Rozumiesz?
moze chodzi i co to ze 'and' trzeba zamienic na 'or' smile.gif

gdybys chcial wyszukac like 'b1a' and 'b%' to powinno znalesc:
4 111 b1a

Chodzi o to w podanym przez ciebie warunku logicznym sprawdzasz caly czas jeden rekord, jedna kolumne.
Mowiąc krótko: a1b nie zaczyna sie od b, dlatego nie znajduje danych.
barthezpl
Dzięki za odp.
Ale jak wyszukać wszystkie osoby, które mają zarówno uprawienie a1 i c1
wiiir
SELECT id_osoby ,GROUP_CONCAT(kod_upr SEPARATOR ',') as kod_upr FROM tabelka GROUP BY id_osoby having kod_upr = 'a1,c1'

Mozna pewnie ladniej ale juz 23 i mi sie nie chce tongue.gif

EDIT: Tylko nie wiem czy ten having zadziala.. jak nie to daj znac
mmmmmmm
  1. SELECT id_osoby FROM tabelka GROUP BY id_osoby HAVING Count(DISTINCT Case When kod_upr IN ('a1','c1') then kod_upr end)=2
Firebright
Proponuje znacznie ładniejsze (przynajmniej moim zdaniem) i znacznie szybsze (GROUP BY i HAVING są tu zupełnie zbędne) rozwiązanie:
  1. SELECT t1.id_osoby
  2. FROM tabelka t1
  3. INNER JOIN tabelka t2 ON t1.id_osoby = t2.id_osoby AND t1.kod_upr = 'a1' AND t2.kod_upr = 'c1';
mmmmmmm
A dla 10 uprawnień? A dla stu? smile.gif
Firebright
Masz rację, dla większej liczby uprawnień twoje może być wydajniejsze (dla 100 moje jest niewykonalne).
wiiir
Ten IN jest sredni w zastosowaniu, bo w moim przypadku masz jeden parametr i reszta cie gila wink.gif
Chyba ze PDO i inne (albo samo mysql biggrin.gif ) lapia tablice jako argumenty to zwracam honor smile.gif
mmmmmmm
Twój kod też nie działa. smile.gif Po przeróbkach pewnie by zaskoczył, ale jak na razie nie działa...
Przykład:
id_osoby, kod_upr
1, 'c1'
1, 'a1'
I nie działa... Group_CONCAT zwróci 'c1,a1'
Drugi przykład:
id_osoby, kod_upr
1, 'a1'
1, 'c1'
1, 'b1'
smile.gif
wiiir
Bez przesady, wystarczy sortowanie i dziala
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.