Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment rechercher des lignes contenant une sous-chaîne ?

Eh bien, vous pouvez toujours essayer WHERE textcolumn LIKE "%SUBSTRING%" - mais cela est garanti assez lent, car votre requête ne peut pas faire de correspondance d'index car vous recherchez des caractères sur le côté gauche.

Cela dépend du type de champ - une zone de texte ne sera généralement pas enregistrée en tant que VARCHAR, mais plutôt en tant que (une sorte de) champ TEXT, vous pouvez donc utiliser le MATCH CONTRE opérateur.

Pour obtenir les colonnes qui ne correspondent pas, il suffit de mettre un NOT devant le like :WHERE textcolumn NOT LIKE "%SUBSTRING%" .

Que la recherche soit sensible à la casse ou non dépend de la façon dont vous stockez les données, en particulier du COLLATION que vous utilisez. Par défaut, la recherche sera insensible à la casse.

Réponse mise à jour pour refléter la mise à jour de la question :

Je dis que faire un champ WHERE field LIKE "%value%" est plus lent que le champ WHERE field LIKE "value%" si le champ de colonne a un index, mais cela reste beaucoup plus rapide que d'obtenir toutes les valeurs et d'avoir votre filtre d'application. Les deux scénarios :

1/ Si vous faites SELECT field FROM table WHERE field LIKE "%value%" , MySQL analysera toute la table et n'enverra que les champs contenant "value".

2/ Si vous faites SELECT field FROM table puis demandez à votre application (dans votre cas, PHP) de filtrer uniquement les lignes contenant une "valeur", MySQL analysera également la table entière, mais enverra tous les champs à PHP, qui devra alors effectuer un travail supplémentaire. C'est beaucoup plus lent que le cas n° 1.

Solution :Veuillez utiliser le WHERE clause, et utilisez EXPLAIN pour voir les performances.