2010-03-09 17 views
6

Esta es probablemente una pregunta simple, pero no he podido encontrar una solución en línea, cualquier ayuda sería muy apreciada.posible crear una consulta sql con comodines de tabla?

Estoy tratando de crear una consulta SQL en PHP y me gustaría aplicar de alguna manera un comodín al filtro TABLE ... algo como .... select * from %_table_%. Sin embargo, hasta ahora solo he podido ver filtros para valores de columnas, no nombres de tablas.

como ejemplo que tendría tablas tales como:

jan_table_1 
feb_table_1 
jan_table_2 
feb_table_2 

y querría decir, seleccionar sólo las tablas con un prefijo "jan" ... o sufijo "1".

¿Hay una solución rápida y fácil para esto que no he visto? ¡Gracias por adelantado!

+0

¿Es capaz de modificar esta estructura? No está normalizado, no debe tener una tabla para cada mes – Leslie

Respuesta

7

No hay. Pero las tablas no deben separarse por mes. En su lugar, se deben usar los índices apropiados para acelerar el acceso.

2

La única manera de hacerlo es generando dinámicamente la instrucción SQL para una tabla en particular y ejecutándola.

El hecho de que quiera hacer esto sugiere que debe volver a visitar el diseño de su esquema de tabla.

1

No puede usar un comodín al seleccionar de las tablas.

Lo que podría hacer es crear una vista sobre sus tablas "jan_*" o "*_1" y seleccionar desde allí.

Deberá actualizar esa vista cada vez que se agreguen tablas.

7

En el servidor SQL, es posible consultar los nombres de tabla que desea como esto

select * from sys.tables where name like '%table%' 

En su código se podía recorrer los nombres de tabla y ejecutar la consulta en cada mesa y combinar los resultados. La mayoría de los demás RDBMS tienen una funcionalidad similar.

+2

mysql 'seleccione TABLE_NAME de INFORMATION_SCHEMA.TABLES donde TABLE_NAME como '% pattern%'' Vea también https://dev.mysql.com/doc/refman/5.0/ es/information-schema.html – here

3

No debe particionar tablas como esta. En su lugar, considere ponerlo todo en una tabla unificada, con columnas para el mes y el índice o crear una tabla con mes y el índice de columnas, y hacen referencia a un identificador de fila de la otra tabla:

Opción 1: mesa unificada:

CREATE TABLE Unified (
    month CHAR(3) NOT NULL, 
    ix INT NOT NULL DEFAULT 1, 
    [...], 
    PRIMARY (month, ix, somethingMore), 
    CHECK month IN (
      'jan', 'feb', 'mar', 'apr', 'may', 'jun', 
      'jul', 'aug', 'sep', 'oct', 'nov', 'dec') 
); 

SELECT * FROM Unified where month = 'jan' AND ix = 1; 

// select only tables with a "jan" prefix... or "1" suffix. 
SELECT * FROM Unified where month = 'jan' OR ix = 1 

Opción 2: Utilice una clave externa:

CREATE TABLE Partitions (
    id INT AUTO_INCREMENT PRIMARY, 
    month CHAR(3) NOT NULL, 
    ix INT NOT NULL DEFAULT 1, 
    CHECK month IN (
      'jan', 'feb', 'mar', 'apr', 'may', 'jun', 
      'jul', 'aug', 'sep', 'oct', 'nov', 'dec'), 
    INDEX (month, ix) 
) 

CREATE TABLE Stuff (
    partition INT NOT NULL, 
    [...], 
    PRIMARY KEY (partition, somethingMore), 
    FOREIGN KEY fk_Stuff_Partitions (partition) REFERENCES Partitions (id) 
) 

SELECT * FROM Stuff 
    INNER JOIN Partitions ON Stuff.partition = Partitions.id 
WHERE Partition.month = 'jan' AND Partition.ix = 2; 

// select only tables with a "jan" prefix... or "1" suffix. 
SELECT DISTINCT * FROM Stuff 
    INNER JOIN Partitions ON Stuff.partition = Partitions.id 
WHERE Partition.month = 'jan' OR Partition.ix = 1; 
Cuestiones relacionadas