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

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

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


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'

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'

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


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


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 .


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.