MySQL Como vários valores

144

Eu tenho essa consulta MySQL.

Eu tenho campos de banco de dados com este conteúdo

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

Por que essa consulta semelhante não funciona? Eu preciso dos campos com esportes ou pub ou ambos?

SELECT * FROM table WHERE interests LIKE ('%sports%', '%pub%')
webmasters
fonte

Respostas:

133

A (a,b,c)lista funciona apenas com in. Para like, você deve usar or:

WHERE interests LIKE '%sports%' OR interests LIKE '%pub%'
Andomar
fonte
3
Isso não seria benéfico em várias (digamos, 5 ou mais consultas dinâmicas pesquisáveis), portanto, seria melhor usar o regexp.
Shayan Ahmad
315

Maneira mais rápida de fazer isso:

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

é isto:

WHERE interests REGEXP 'sports|pub'

Encontre esta solução aqui: http://forums.mysql.com/read.php?10,392332,392950#msg-392950

Mais sobre o REGEXP aqui: http://www.tutorialspoint.com/mysql/mysql-regexps.htm

jazkat
fonte
se você estiver passando uma quantidade desconhecida de palavras-chave como uma sequência (a | b | c ...), o regexp é o único caminho a percorrer, se você quiser fazer o LIKE, é?
freqüente
1
Você sabe se isso pode ser feito com uma subconsulta? Digamos que eu tenho uma coluna de palavras que preciso pesquisar, como posso substituir 'sports | pub' por uma subconsulta?
AdamMc331
Ei, você poderia me dizer o REGEXP para LIKE, em vez de% LIKE%, estou tentando buscar seqüências de caracteres exatas ...
Deepanshu Goyal 24/15/15
3
Esta solução sopra o primeiro a sair da água
Donato
2
Para obter o valor regexp de uma coluna:(select group_concat(myColumn separator '|') from..)
daVe 28/11
34

Por que você não tenta o REGEXP. Tente assim:

SELECT * FROM table WHERE interests REGEXP 'sports|pub'
Ahmad Hussain
fonte
5
Sim!! Eu quero o caminho oposto. Por isso, é SELECT * FROM table WHERE interests NOT REGEXP 'sports|pub' (> ‿◠) ✌
Patros
3
Qual é a diferença dessa jazkatresposta 5 anos antes da sua?
Vaidas 26/09
@ Vaidas - obrigado - estava me fazendo a mesma pergunta ...: D
theFriedC
18

Você também pode usar RLIKEtambém.

Por exemplo:

SELECT * FROM TABLE_NAME WHERE COLNAME RLIKE 'REGEX1|REGEX2|REGEX3'
iamharish15
fonte
6
Basta observar para todos que RLIKE e REGEXP são sinônimos
Intacto
8

Sua consulta deve ser SELECT * FROM `table` WHERE find_in_set(interests, "sports,pub")>0

O que eu entendo é que você armazena os interesses em um campo da sua tabela, o que é um equívoco. Você deve definitivamente ter uma tabela de "interesse".

Alexis Dufrenoy
fonte
2
Eu acho que deveria ser SELECT * FROM table WHERE find_in_set(interests, 'sports,pub'), mas é provável que essa técnica supere o regex na maioria das situações.
21417 Chris Strickland
7

Não se esqueça de usar parênteses se você usar esta função após um ANDparâmetro

Como isso:

WHERE id=123 and(interests LIKE '%sports%' OR interests LIKE '%pub%')
Luan
fonte
3

Ou se você precisar corresponder apenas ao início das palavras:

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

você pode usar as correspondências de intercalação regexp:

WHERE interests REGEXP '^sports|^pub'

https://www.regular-expressions.info/anchors.html

vadim
fonte
2

Como o @Alexis Dufrenoy propôs, a consulta poderia ser:

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

Mais informações no manual .

Franc Drobnič
fonte
1

Mais exemplos de trabalho:

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";

A tarefa era contar participantes em um evento com filtro se a extensão de email fosse igual a vários domínios da empresa.

Intacto
fonte