2012-09-23 18 views
21

Tengo una tabla que consta de 64 campos diferentes. Voy a buscar con una sola palabra clave, los resultados deben coincidir con la palabra clave de cualquier campo. Da algunas sugerenciasBuscar todas las columnas de una tabla usando una única condición where con palabra clave única en mysql

+4

no olvides hacer clic en las respuestas que te han ayudado. –

+0

^Estoy completamente de acuerdo y tengo pensamientos similares :) – instanceOfObject

+0

select * from * where * like% search_text%. Es posible ??? –

Respuesta

5

puede utilizar la condición donde con múltiple con OR

como

where 
name = 'expected' 
OR rate ='expected' 
OR country ='expected' 
+0

si uso O, tengo que usar todos los 64 campos. ¿Hay alguna otra solución para esto ...? –

+0

¿Has verificado mis soluciones en la misma publicación? – instanceOfObject

+0

@instanceOfObject que !!!! ¿¿Qué quieres decir?? –

2

no puedo ver un camino alrededor de su consulta es simple pero a largo:

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

En lugar de Usando una variable de MySQL, puedes usar una variable específica del idioma, pero por el bien de los ejemplos, pensé que me quedaría con MySQL.

El "..." es donde colocaría las otras 61 columnas/campos.

+0

Esto es una sintaxis pequeña pero tiene que escribir códigos loooooooooong :) –

1

La solución más simple sería usar múltiples ORs.

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

Puede utilizar like o = como por la exigencia, pero se requerirá para cambiar la consulta cada vez que se agrega una nueva columna. Como alternativa, puede tomar SQLDump for that table y luego search ese archivo.

Con algunas google,

  1. Ver si este proyecto es útil - http://code.google.com/p/anywhereindb/. Búsquedas en todos los campos y alabado por muchos.

  2. Intente utilizar la información de la tabla information_schema. Busque todas las columnas en la tabla. Ahora, intente formar su consulta utilizando esta información.

1

Si usted puede traducir esta sintaxis SQL Server a MySQL

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

Se puede escribir una consulta que va a generar una consulta para cada columna de la tabla. En el ejemplo que sigue el esquema ("propietario") es 'DEV_USER' la mesa con sus 64 campos se llama 'CUSTOMER_INFO' Los criterios en la búsqueda es cualquier columna con un valor de 'VT' en él:

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

Esta única consulta generará una consulta para cada campo. Los resultados de ejecutar lo anterior serían;

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 

Luego solo pega aquellas consultas que se generaron desde su primera consulta en otra pestaña y las ejecuta.

Espero que ayude. :-)

+1

Increíblemente ineficiente. –

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

Voila.

El '|' separador, por cierto, es para evitar que encuentre coincidencias coincidentes en las que, por ejemplo, la columna 1 termina en 'V' y la columna2 comienza en 'T', lo que le daría un falso positivo en la búsqueda de "VT".

No estoy seguro de si el método anterior es más rápido que el método OR (supongo que tienen la misma velocidad), pero definitivamente implica menos tipeo si está escribiendo la consulta a mano.

2

Otra posibilidad sería utilizar FOR XML para obtener todas las columnas para imprimir en un solo campo ... como esto:

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

podría tomar un tiempo para funcionar si se trata de una mesa especialmente grande, pero debería forzosamente forzarte a descubrir si esa cadena existe en cualquier tabla dada.

+0

¿Para qué son los corchetes? Esto es MySQL, no SQL-Server. – Barmar

+0

Gracias Barmar ... buena captura :-) – processoriented

+0

'FOR XML RAW' es un Microsoft SQL Server-ismo, no admitido por MySQL. –

0

Puede usar SQL dinámico para generar y ejecutar una consulta que busque todas las columnas.

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'); 
Cuestiones relacionadas