web-dev-qa-db-fra.com

Rechercher dans toutes les colonnes d'une table en utilisant une seule condition where avec un seul mot clé dans mysql

J'ai une table composée de 64 champs différents. Je vais chercher avec un seul mot clé, les résultats doivent correspondre au mot clé de n'importe quel champ Donner des suggestions.

22
R J.
SELECT * FROM `some_table`
WHERE
CONCAT_WS('|',`column1`,`column2`,`column3`,`column4`,`column64`) # single condition, many columns
LIKE '%VT%'

Voila.

Le '|' separator, en passant, vous empêche de trouver des correspondances fortuites où, par exemple, column1 se termine par 'V' et column2 commence par 'T', ce qui vous donnerait un faux positif dans la recherche de "VT".

Je ne sais pas si la méthode ci-dessus est plus rapide que la méthode OR (je suppose qu'elles ont la même vitesse), mais cela implique certainement moins de dactylographie si vous écrivez la requête à la main.

10
Buttle Butkus

vous pouvez utiliser où avec plusieurs conditions avec OR

comme 

where
name = 'expected'
OR rate ='expected' 
OR country ='expected'
5
NullPoiиteя

Je ne vois pas comment votre requête serait simple mais longue:

SET @term = "Somesearch";
SELECT id, title FROM sometable WHERE
    col1 LIKE '%@term%' OR
    col2 LIKE '%@term%' OR
    col3 LIKE '%@term%' ...;

Au lieu d'utiliser une variable MySQL, vous pouvez simplement utiliser une variable spécifique à la langue, mais par souci d'exemples, j'ai pensé rester avec MySQL.

Le "..." est l'endroit où vous placeriez les 61 autres colonnes/champs.

2
tdlm

Une autre possibilité serait d'utiliser FOR XML pour que toutes les colonnes soient imprimées dans un seul champ ... comme ceci:

SELECT c.*
FROM (
SELECT a.*
,( SELECT *
   FROM table_to_search b
   WHERE a.KeyField = b.KeyField
   FOR XML RAW) AS `Full_Text_Record`
FROM table_to_search a) c
WHERE c.`Full_Text_Record` LIKE '%Search_string%'

L'exécution peut prendre un certain temps s'il s'agit d'une table particulièrement volumineuse, mais cela devrait vous obliger à déterminer si cette chaîne existe dans une table donnée.

2
processoriented

La solution la plus simple consisterait à utiliser plusieurs ORs.

select * from TAB where col1 like "%VAR%" OR col2 like "%VAR%" OR......col64 like "%VAR%";

Vous pouvez utiliser like ou = selon les besoins, mais vous devrez modifier votre requête chaque fois que vous ajoutez une nouvelle colonne.

Au lieu de cela, vous pouvez utiliser SQLDump for that table puis search ce fichier.

Avec du googling, 

  1. Vérifiez si ce projet est utile - http://code.google.com/p/anywhereindb/ . Cherche dans tous les champs et fait l’éloge de nombreux.

  2. Essayez d'utiliser les informations de la table information_schema. Recherchez toutes les colonnes du tableau. Maintenant, essayez de former votre requête en utilisant ces informations.

1
instanceOfObject

Si vous pouvez traduire cette syntaxe SQL Server en MySQL

WHERE
name = @keyword OR
country = @keyword OR
department = @keyword OR
@keyword IS NULL -- match all when search text is empty
1
codingbiz

Vous pouvez écrire une requête qui générera une requête pour chaque colonne de votre table . Dans l'exemple ci-dessous, le schéma ("propriétaire") est "DEV_USER" La table avec vos 64 champs s'appelle "CUSTOMER_INFO" Les critères de la recherche sont les colonnes contenant la valeur "VT":

select 'SELECT ' || COLUMN_NAME || ' FROM CUSTOMER_INFO
WHERE '  || COLUMN_NAME || q'# LIKE '%VT%';#'
FROM ALL_TAB_COLS 
WHERE OWNER = 'DEV_USER'
AND TABLE_NAME = 'CUSTOMER_INFO'; 

Cette requête générera une requête pour chaque champ pour vous . Les résultats de l'exécution de ce qui précède seraient;

SELECT ADDRESS_1 FROM CUSTOMER_INFO
WHERE ADDRESS_1 LIKE '%VT%';

SELECT ADDRESS_2 FROM CUSTOMER_INFO
WHERE ADDRESS_2 LIKE '%VT%';

SELECT CITY FROM CUSTOMER_ADDRESSES_QASB
WHERE CITY LIKE '%VT%';

SELECT STATE_PROVINCE FROM CUSTOMER_INFO
WHERE STATE_PROVINCE LIKE '%VT%';

SELECT Zip_POSTAL_CODE FROM CUSTOMER_INFO
WHERE Zip_POSTAL_CODE LIKE '%VT%';
WHERE LATITUDE LIKE '%VT%';

... and so on for each column in the table

Ensuite, il vous suffit de coller les requêtes générées à partir de votre première requête dans un autre onglet et de les exécuter.

J'espère que cela pourra aider. :-)

0
user2569747

Vous pouvez utiliser le SQL dynamique pour générer et exécuter une requête qui recherche toutes les colonnes.

DELIMITER $$
CREATE PROCEDURE searchAllCols(inDB VARCHAR(64), inTable VARCHAR(64), search VARCHAR(32))
BEGIN
    SET @matches = (
        SELECT GROUP_CONCAT(CONCAT('`', COLUMN_NAME, '` LIKE "%', search, '%"') SEPARATOR ' OR ')
        FROM INFORMATION_SCHEMA.COLUMNS
        WHERE table_name = inTable and table_schema = inDB);
    PREPARE stmt FROM CONCAT('SELECT * FROM `', inDB, '`.`', inTable, '` WHERE ', @matches);
    EXECUTE stmt;
END
$$
CALL searchAllCols('table_to_search', 'searchString');
0
Barmar