web-dev-qa-db-fra.com

Rechercher une chaîne dans toute la table de MySQL

J'essaie de rechercher une chaîne dans une table entière de MySQL. 

Je veux rechercher tous les champs et toutes les entrées d'une table, en retournant chaque entrée complète qui contient le texte spécifié.

Je n'arrive pas à comprendre comment rechercher facilement plusieurs champs. Voici les détails:

La table est "clients". Il a environ 30 champs et 800 entrées, trop pour tout afficher en même temps dans un navigateur. Je voudrais rechercher un nom ("Mary"), mais il pourrait être dans le shipping_name field ou le billing_name field, ou le champ email, etc. 

Je voudrais rechercher dans tous les champs toutes les entrées contenant la chaîne "Mary". C’est ce qui, à mon avis, devrait fonctionner mais ne fonctionne pas:

SELECT * FROM `clients` IN 'Mary'
25
VoltzRoad

Essayez quelque chose comme ça:

SELECT * FROM clients WHERE CONCAT(field1, '', field2, '', fieldn) LIKE "%Mary%"

Vous souhaiterez peut-être consulter la documentation SQL pour obtenir des informations supplémentaires sur les opérateurs de chaîne et les expressions régulières.

Edit: Il peut y avoir quelques problèmes avec les champs NULL, donc au cas où vous voudriez utiliser IFNULL(field_i, '') au lieu de field_i

Sensibilité à la casse : Vous pouvez utiliser une collation ne respectant pas la casse ou quelque chose comme ceci:

... WHERE LOWER(CONCAT(...)) LIKE LOWER("%Mary%")

Il suffit de chercher dans tous les champs : Je pense qu’il n’ya aucun moyen de créer une requête SQL qui parcourt l’ensemble des champs sans déclarer explicitement le champ dans lequel effectuer la recherche. La raison en est qu’il existe une théorie des bases de données relationnelles et des règles strictes de manipulation. les données relationnelles (quelque chose comme l'algèbre relationnelle ou l'algèbre de codd; ce sont de là les bases du code SQL), et la théorie n'autorise pas des choses comme "il suffit de chercher dans tous les champs". Bien entendu, le comportement réel dépend de la réalisation concrète du fournisseur. Mais dans les cas courants ce n'est pas possible. Pour vous en assurer, vérifiez la syntaxe de l'opérateur SELECT (section WHERE, pour être précis).

21
Artem Pyanykh

Identifiez tous les champs pouvant être liés à votre recherche, puis utilisez une requête du type:

SELECT * FROM clients
WHERE field1 LIKE '%Mary%'
   OR field2 LIKE '%Mary%'
   OR field3 LIKE '%Mary%'
   OR field4 LIKE '%Mary%'
   ....
   (do that for each field you want to check)

Utiliser LIKE '%Mary%' au lieu de = 'Mary' cherchera les champs qui contiennent someCaracters + 'Mary' + someCaracters.

14
Francis P

En plus de correspondance de motif avec le mot clé 'like'. Vous pouvez également effectuer une recherche. En utilisant fulltext feature comme ci-dessous;

SELECT * FROM clients WHERE MATCH (shipping_name, billing_name, email) AGAINST ('mary')
7
Soner

Une solution basée sur PHP pour la recherche dans tout le tableau! La chaîne de recherche est $ string. Ceci est générique et fonctionnera avec toutes les tables avec un nombre quelconque de champs

$sql="SELECT * from client_wireless";
$sql_query=mysql_query($sql);
$logicStr="WHERE ";
$count=mysql_num_fields($sql_query);
for($i=0 ; $i < mysql_num_fields($sql_query) ; $i++){
 if($i == ($count-1) )
$logicStr=$logicStr."".mysql_field_name($sql_query,$i)." LIKE '%".$string."%' ";
else
$logicStr=$logicStr."".mysql_field_name($sql_query,$i)." LIKE '%".$string."%' OR ";
}
// start the search in all the fields and when a match is found, go on printing it .
$sql="SELECT * from client_wireless ".$logicStr;
//echo $sql;
$query=mysql_query($sql);
3
Arpan Dubey

Si vous recherchez simplement du texte et que vous n'avez pas besoin d'un jeu de résultats à des fins de programmation, vous pouvez installer HeidiSQL gratuitement (j'utilise la version 9.2.0.4947).

Cliquez avec le bouton droit sur une base de données ou une table et sélectionnez "Rechercher du texte sur le serveur".

Tous les résultats sont affichés dans un onglet distinct pour chaque tableau - très agréable.

Effroyablement utile et m'a sauvé des heures. Oubliez les longues requêtes !!

3
gonzo

Si vous utilisez Sublime, vous pouvez facilement générer des centaines ou des milliers de lignes en utilisant Text Pastry en conjonction avec la sélection de plusieurs lignes et Emmet .

Donc, dans mon cas, j'ai défini le type de document sur html, puis tapé div*249, appuyé sur l'onglet et Emmet crée 249 divs vides. Puis, en utilisant la sélection multiple, j’ai tapé col_id_ dans chacun et déclenché Text Pastry pour insérer un numéro d’identification incrémentiel. Ensuite, avec une nouvelle sélection multiple, vous pouvez supprimer le balisage div et le remplacer par la syntaxe MySQL.

0
James Smith

pour des besoins spécifiques, les éléments suivants fonctionneront pour la recherche:

select * from table_name where (column_name1='%var1%' or column_name2='var2' or column_name='%var3%') and column_name='var';

si vous souhaitez rechercher des données dans la base de données, cela fonctionnera parfaitement.

0
user7957410