2011-01-25 9 views
19

Tengo varias columnas en mis bases de datos con nombres similares. ¿Cómo selecciono aquellos basados ​​en la palabra con la que comienzan? He aquí un ejemplo de disposición de mesa: enter image description here¿Seleccionar todas las columnas que comienzan con XXX usando un comodín?

he intentado seleccionar toda la información para una cosa en particular (tipo de alimentos en este ejemplo) usando

$Food = "Vegetable"; 
mysql_query("SELECT `" . $Food . " %` FROM `Foods`"); 

pero no parece funcionar.

Cualquier ayuda sería apreciada :-)

EDIT: Al parecer, esto no estaba claro de mi ejemplo, pero ya saben primeras palabras de todas las columnas. Las columnas son siempre iguales y nunca se agregan ni eliminan "tipos de alimentos". La variable PHP solo está ahí para determinar cuál de un par de tipos de conjuntos necesito.

+0

Aparte del hecho de que no puedo concebir una forma sensata de hacerlo, no es una gran idea por la misma razón que SELECT * no es una gran idea; si agrega/elimina columnas relacionadas con vegetales, su consulta arroja resultados inesperados. –

+0

Creo que todos aquí entendieron la pregunta. Lo que estamos diciendo es que no podrá crear dicha consulta en una sola llamada. Si conoce el nombre de cada columna, buclee en ellas para encontrar cuál comienza con su prefijo y luego genere una instrucción SQL Select dinámicamente. –

+0

Ok, estoy algo confundido por el hecho de que los comodines no están permitidos cuando se seleccionan datos basados ​​en el nombre de la columna. – Chris

Respuesta

5

No hay forma de hacer exactamente lo que está intentando. Primero puede hacer otra consulta para buscar todos los nombres de columna, luego procesarlos en PHP y generar la segunda consulta, pero eso es probablemente más complejo que simplemente escribir los nombres que desea.

¿O hay alguna razón por la cual esta consulta debe ser dinámica? ¿La estructura de la mesa cambiará a menudo?

+0

No, nunca cambiará, así que no creo que esto sea muy complicado, todo lo que necesito es el comodín correcto para que coincida con todas las columnas de cierto tipo (= comenzando con una palabra determinada, definida por una var PHP). – Chris

+0

@Chris: Eso es lo que digo, no hay tal comodín. MySQL no es compatible con eso. O bien debe poner '*' para todas las columnas, o definirlas individualmente. –

+0

¿Cómo los definiría individualmente? Un enlace a un ejemplo sería suficiente:] – Chris

15

Tendría que construir el SQL de forma dinámica. Como punto de partida, esto te daría los nombres de las columnas que estás buscando.

SELECT COLUMN_NAME 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE table_name = 'Foods' 
     AND table_schema = 'YourDB' 
     AND column_name LIKE 'Vegetable%' 
+0

Lo siento, tal vez mi ejemplo no fue lo suficientemente claro, pero ya sé todos los nombres de las columnas, seguirán siendo los mismos. Solo estoy buscando el comodín correcto y una forma de usarlo. – Chris

+2

@Chris: no puede usar un comodín para la lista de columnas de una instrucción select. El SQL se debe compilar dinámicamente para que cada nombre de columna se mencione explícitamente en la selección. –

+0

Ok, voy a ir con la definición individual de mis columnas y luego, usando la variable PHP en cada nombre que defino :-) Gracias – Chris

1

¿Qué le parece crear la consulta en 2 pasos?

1- obtener el nombre de la columna del esquema db (o en otro lugar)

2- Generar una consulta SQL con el nombre de la columna correspondientes a su condición de filtro.

+0

Ya conozco los nombres de las columnas, estoy buscando ayuda para crear la consulta que coincidirá con el columnas similares, de las cuales ya sé la primera palabra. – Chris

2

convertir su base de datos a otro con tres columnas:

Product_type (vegetable, fruit, etc) 

Name (apple, carrot, etc) 

color (orange, yellow, etc) 

Ahora usted puede utilizar su comodín para obtener sólo un determinado tipo, ya que ahora se encuentra en una columnas, no en la cabecera.

3

Aquí está una manera que lo hice exclusivamente con MySQL:

SET SESSION group_concat_max_len = 2048; 
SELECT GROUP_CONCAT(CONCAT(" ",CAST(column_name as CHAR(50)))) FROM information_schema.columns WHERE table_name='real_big_table' AND column_name LIKE 'prefix%' INTO @sub; 
SET @x = CONCAT("SELECT ",@sub," FROM my_db.real_big_table WHERE my_db.real_big_table.country_id='US'"); 
PREPARE stmt FROM @x; 
EXECUTE stmt; 

Mi respuesta es inspirada por this answer.

Nota: Mi 'DBA interno' (en forma de un pequeño ángel en mi hombro) me dice que la necesidad de hacer esto es probablemente un signo de mala estructura de DB, pero mi 'hacker interno' (en la forma de un pequeño diablo en mi otro hombro) dice "¡solo hazlo!"

Cuestiones relacionadas