MySQL Podobnie jak wiele wartości

144

Mam to zapytanie MySQL.

Mam pola bazy danych z taką zawartością

sports,shopping,pool,pc,games 
shopping,pool,pc,games 
sports,pub,swimming, pool, pc, games   

Dlaczego to podobne zapytanie nie działa? Potrzebuję boisk ze sportem, pubem lub obydwoma?

SELECT * FROM table WHERE interests LIKE ('%sports%', '%pub%')
webmasterów
źródło

Odpowiedzi:

133

(a,b,c)Lista działa tylko z in. Dla like, trzeba użyć or:

WHERE interests LIKE '%sports%' OR interests LIKE '%pub%'
Andomar
źródło
3
Nie byłoby to korzystne w przypadku wielu zapytań (powiedzmy 5 lub więcej dynamicznych zapytań z możliwością wyszukiwania), dlatego lepiej byłoby użyć wyrażenia regularnego.
Shayan Ahmad
315

Szybszy sposób na zrobienie tego:

WHERE interests LIKE '%sports%' OR interests LIKE '%pub%'

czy to jest:

WHERE interests REGEXP 'sports|pub'

Znalazłem to rozwiązanie tutaj: http://forums.mysql.com/read.php?10,392332,392950#msg-392950

Więcej o REGEXP tutaj: http://www.tutorialspoint.com/mysql/mysql-regexps.htm

jazkat
źródło
jeśli przekazujesz nieznaną liczbę słów kluczowych jako ciąg (a | b | c ...), wyrażenie regularne jest jedynym sposobem, aby zrobić LIKE, prawda?
częste
1
Czy wiesz, czy można to zrobić za pomocą podzapytania? Powiedzmy, że mam kolumnę słów, które muszę wyszukać, jak mogę zastąpić „sport | pub” podzapytaniem?
AdamMc331,
Hej, czy mógłbyś mi powiedzieć REGEXP dla LIKE zamiast% LIKE%, próbuję pobrać dokładne ciągi znaków ...
Deepanshu Goyal
3
To rozwiązanie wysadza pierwszego z wody
Donato
2
Aby uzyskać wartość (select group_concat(myColumn separator '|') from..)
wyrażenia regularnego
34

Dlaczego nie spróbować REGEXP. Spróbuj tak:

SELECT * FROM table WHERE interests REGEXP 'sports|pub'
Ahmad Hussain
źródło
5
Tak!! Chcę tego w inny sposób. Tak to jest SELECT * FROM table WHERE interests NOT REGEXP 'sports|pub' (> ‿◠) ✌
Patros
3
Czym ta odpowiedź różni się od jazkatodpowiedzi przesłanej 5 lat wcześniej?
Vaidas
@Vaidas - dziękuję - zadawałem sobie to samo pytanie ...: D
theFriedC
18

Możesz również użyć RLIKE.

Na przykład:

SELECT * FROM TABLE_NAME WHERE COLNAME RLIKE 'REGEX1|REGEX2|REGEX3'
iamharish15
źródło
6
Uwaga dla wszystkich, że RLIKE i REGEXP są
synonimami
8

Twoje zapytanie powinno brzmieć SELECT * FROM `table` WHERE find_in_set(interests, "sports,pub")>0

Rozumiem, że przechowujesz interesy w jednym polu swojego stołu, co jest błędnym przekonaniem. Ostatecznie powinieneś mieć tabelę „odsetek”.

Alexis Dufrenoy
źródło
2
Myślę, że tak powinno być SELECT * FROM table WHERE find_in_set(interests, 'sports,pub'), ale w większości sytuacji ta technika prawdopodobnie przewyższy regex.
Chris Strickland,
7

Nie zapomnij użyć nawiasów, jeśli używasz tej funkcji po ANDparametrze

Lubię to:

WHERE id=123 and(interests LIKE '%sports%' OR interests LIKE '%pub%')
Luan
źródło
2

Jak zaproponował @Alexis Dufrenoy, zapytanie może wyglądać następująco:

SELECT * FROM `table` WHERE find_in_set('sports', interests)>0 OR find_in_set('pub', interests)>0

Więcej informacji w instrukcji .

Franc Drobnič
źródło
1

Więcej przykładów pracy:

SELECT COUNT(email) as count FROM table1 t1 
JOIN (
      SELECT company_domains as emailext FROM table2 WHERE company = 'DELL'
     ) t2 
ON t1.email LIKE CONCAT('%', emailext) WHERE t1.event='PC Global Conference";

Zadanie polegało na zliczaniu uczestników wydarzenia (wydarzeń) z filtrem, jeśli rozszerzenie adresu e-mail było równe wielu domenom firmy.

Intacto
źródło