web-dev-qa-db-fra.com

'Comme ça%' OR '% that%') et quelque chose = else 'ne fonctionne pas

J'ai une requête select où j'essaie de rechercher des modèles dans plusieurs chaînes

LIKE ('%this%' or '%that%' ) and something=else

Renvoie zéro résultat

Toutefois 

LIKE '%this%' and something=else

renvoie les résultats .__ et 

LIKE '%that%' and something=else

renvoie le résultat

Est-il possible de regrouper tous mes résultats en une seule requête? Si une chaîne correspond aux deux, comment va-t-il gérer cela?

33
Kevin Ohashi

Ce serait bien si vous le pouviez, mais vous ne pouvez pas utiliser cette syntaxe dans SQL.

Essaye ça:

(column1 LIKE '%this%' OR column1 LIKE '%that%') AND something = else

Notez l'utilisation des crochets! Vous en avez besoin autour de l'expression OR.
Sans crochets, il sera analysé avec A OR (B AND C), ce qui ne vous donnera pas les résultats que vous attendez.

70
Bohemian
Instead of using `LIKE` use `REGEXP`.

For example:

    REGEXP 'THIS|THAT'

For example:

    REGEXP 'THIS|THAT'
mysql> SELECT 'pi' REGEXP 'pi|apa';                     -> 1
mysql> SELECT 'axe' REGEXP 'pi|apa';                    -> 0
mysql> SELECT 'apa' REGEXP 'pi|apa';                    -> 1
mysql> SELECT 'apa' REGEXP '^(pi|apa)$';                -> 1
mysql> SELECT 'pi' REGEXP '^(pi|apa)$';                 -> 1
mysql> SELECT 'pix' REGEXP '^(pi|apa)$';                -> 0

Refer:
http://dev.mysql.com/doc/refman/5.1/en/regexp.html
20
Nijat Asad

Découpez les clauses LIKE en 2 déclarations distinctes, à savoir:

(fieldname1 LIKE '%this%' or fieldname1 LIKE '%that%' ) and something=else
3
Ryan

Avez-vous quelque chose contre la division?

...FROM <blah> 
   WHERE 
     (fieldA LIKE '%THIS%' OR fieldA LIKE '%THAT%') 
     AND something = else
2
josh.trow

As-tu essayé:

(column LIKE '%this%' and something=else) or (column LIKE '%that%' and something=else)
1
BumbleB2na

Je sais que la question est un peu ancienne, mais que les gens essaient toujours de trouver une solution efficace, vous devriez plutôt utiliser FULLTEXT index (disponible à partir de MySQL 5.6.4).

Requête sur table avec + 35mil enregistrements par triple like dans où le bloc a pris ~ 2.5s mais après avoir ajouté l'index sur ces champs et utilisé BOOLEAN MODE inside match ... against ..., il n'a fallu que 0.05s.

0
Michal_Szulc