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%')

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%'

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


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'

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'

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”.


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%')


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 .


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.