2011-10-13 9 views
7

Es posible mostrar el nombre de una tabla en un db donde hay un valor específico presente. Tengo diferentes tablas y quiero mostrar solo los nombres de las tablas que contienen un valor específico en cualquiera de los campos.Mostrar el nombre de la tabla donde está presente un valor

+0

Sí, es perfectamente posible, tengo algunos en mi caja de herramientas personal, por ejemplo, buscar una fecha, cadena y valores decimales, etc. pero utiliza tablas internas de DB y poco lento, ya que ejecuta cursores sobre cada columna de tabla, pero luego viene personas quejándose acerca de por qué está en SQL Server o por qué selecciona las tablas del sistema. –

+0

¿Es necesario que sea lo suficientemente flexible para trabajar con los tipos de datos, o solo texto, o qué? ¿Tiene que coincidir todo el valor de la columna? – grossvogel

+0

Básicamente busca el número de identificación de una persona. Si lo encuentra en decir 3 de las 5 tablas. Muestra el nombre de esas 3 tablas – SebastianOpperman

Respuesta

1

Esto devolverá un montón de conjuntos de resultados vacíos, pero los que no estén vacíos corresponden a las combinaciones de la tabla/columna que se ajustan a su búsqueda. Sólo funciona para el texto, y detecta las columnas que contienen el valor (en oposición a un partido de la columna completa.)

DELIMITER | 

DROP PROCEDURE IF EXISTS `SearchAllTables`| 
CREATE PROCEDURE `SearchAllTables` (
    IN _search varchar(256) 
    ) 
LANGUAGE SQL 
DETERMINISTIC 
SQL SECURITY DEFINER 
BEGIN 
    -- declare stuff 
    declare _tableName varchar(64); 
    declare _columnName varchar(64); 
    declare _done tinyint(1) default 0; 

    -- we will examine every string column in the database 
    declare _columnCursor cursor for 
     select TABLE_NAME, COLUMN_NAME 
      from INFORMATION_SCHEMA.COLUMNS 
     where TABLE_SCHEMA = database() 
     and (DATA_TYPE like '%char%' 
      or DATA_TYPE like 'text'); 
    declare CONTINUE handler for NOT FOUND 
     SET _done = 1; 

    OPEN _columnCursor; 
    LOOP1: LOOP 
      -- get the next table/column combination 
     FETCH _columnCursor INTO _tableName,_columnName; 
     IF _done = 1 THEN 
      CLOSE _columnCursor; 
      LEAVE LOOP1; 
     END IF; 

      -- query the current column to see if it holds the value 
     SET @query = concat(
      "select '",_tableName,"' as TableName, '", 
         _columnName,"' as ColumnName 
      from ",_tableName," 
      where ",_columnName," like concat('%',?,'%') 
      group by 1;" 
     ); 
     SET @search = _search; 
     PREPARE _stmt FROM @query; 
     EXECUTE _stmt USING @search; 
     DEALLOCATE PREPARE _stmt; 
    END LOOP LOOP1; 
END| 

DELIMITER ; 

Oh, sí, y es feo ... Tal vez él le ayudará, sin embargo!

+0

es feo, pero creo que es la única forma de hacerlo y podría ser útil. +1 – Icarus

+0

¿cómo lo implementaría en mi página php? lo siento esta es una consulta SQL? – SebastianOpperman

+0

@SebastianOpperman: Este script crea un procedimiento almacenado (que por cierto requiere mysql 5). Tendrá que ejecutarlo una vez (a través del cliente mysql o phpMyAdmin) para crear el procedimiento, luego tendrá que llamar al procedimiento de tu script php. Si nunca trabajó con consultas que devuelven resultados múltiples, también puede consultar [esta pregunta] (http://stackoverflow.com/questions/1683794/retrieving-multiple-result-sets-sets-with-stored-procedure-in -php-mysqli). – grossvogel

0
SELECT TABLE_NAME 
FROM information_schema.COLUMNS 
WHERE TABLE_SCHEMA = 'database_name' 
AND COLUMN_NAME = 'column_name' 
+0

Hola, no sé los nombres de las tablas. Básicamente, quiero una consulta que busque en todas las tablas un 'valor' y muestre los nombres de las tablas donde ese 'valor' existe. – SebastianOpperman

Cuestiones relacionadas