Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Ahorrar código creando nueva tabla

Estas en el tema de Ahorrar código creando nueva tabla en el foro de Mysql en Foros del Web. Hola. Mirad, tengo dentro del código PHP una consulta, que no es excesivamente complicada, pero es un chorizo. He oido que en estos casos es ...
  #1 (permalink)  
Antiguo 07/06/2008, 02:06
 
Fecha de Ingreso: octubre-2007
Mensajes: 57
Antigüedad: 16 años, 6 meses
Puntos: 0
Ahorrar código creando nueva tabla

Hola. Mirad, tengo dentro del código PHP una consulta, que no es excesivamente complicada, pero es un chorizo. He oido que en estos casos es conveniente crear la consulta en la misma base de datos y así el SELECT en PHP se reduce a una simple línea. En el código el select es este:

Código PHP:
$query_listados "
    (
    SELECT camp_secretaria_referencia as referencia, camp_secretaria_data as data, camp_secretaria_foto as foto, 
    camp_secretaria_titol as titol, camp_secretaria_text as text, camp_secretaria_paginici as paginici, 
    camp_secretaria_seccio as seccio 
    FROM taula_secretaria 
    WHERE camp_secretaria_paginici ='si'
    )
    UNION 
    (
    SELECT camp_centre_referencia, camp_centre_data, camp_centre_foto, camp_centre_titol, 
    camp_centre_text, camp_centre_paginici, camp_centre_seccio 
    FROM taula_centre 
    WHERE camp_centre_paginici ='si'
    )
    UNION 
    .
    .
    etc hasta 25 tablas en total (consulta probada en MySQL y funciona).
    Devuelve los registros de todas las tablas que cumplen una condición
    y las ordena por fecha descendiente. Asigna alias a los campos.
    .
    .
    ORDER BY data DESC 
    LIMIT 0 , 25
    "

Sólo este código ocupa 180 líneas. Pero no es sólo por eso, sino porque existe otra consulta diferente y porque las dos se utilizan en distintos sitios de diversas páginas.

¿Cómo crear la tabla en la BB.DD. para después hacer referencia a ella en el código? Probablemente no sea nada difícil, pero no lo he hecho nunca y no sé ni por donde empezar. Gracias.
  #2 (permalink)  
Antiguo 07/06/2008, 03:09
 
Fecha de Ingreso: octubre-2007
Mensajes: 57
Antigüedad: 16 años, 6 meses
Puntos: 0
Respuesta: Ahorrar código creando nueva tabla

He encontrado cómo hacerlo. Utilizando CREATE VIEW. Ahora el problema es la sintaxis, que me da error en MySQL:

Código PHP:
CREATE VIEW inici AS (
(
SELECT camp_secretaria_referencia AS referenciacamp_secretaria_data AS
DATA camp_secretaria_foto AS fotocamp_secretaria_titol AS titolcamp_secretaria_text AS textcamp_secretaria_paginici AS paginicicamp_secretaria_seccio AS seccio
FROM taula_secretaria
WHERE camp_secretaria_paginici 
'si'
)
UNION (
.
etc
.
UNION (

SELECT camp_revista_referenciacamp_revista_datacamp_revista_fotocamp_revista_titolcamp_revista_textcamp_revista_paginicicamp_revista_seccio
FROM taula_revista
WHERE camp_revista_paginici 
'si'
)
ORDER BY DATA DESC
LIMIT 0 
25


MySQL ha dicho: Documentación
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'VIEW inici AS
(
(
SELECT camp_secretaria_referencia as referencia, camp_secre' at line 1
  #3 (permalink)  
Antiguo 07/06/2008, 10:12
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Ahorrar código creando nueva tabla

Elimina los paréntesis finales:
Código:
CREATE VIEW inici AS 
SELECT camp_secretaria_referencia AS referencia, camp_secretaria_data AS
DATA , camp_secretaria_foto AS foto, camp_secretaria_titol AS titol, camp_secretaria_text AS text, camp_secretaria_paginici AS paginici, camp_secretaria_seccio AS seccio
FROM taula_secretaria
WHERE camp_secretaria_paginici = 'si'
)
UNION (
.
etc
.
UNION (

SELECT camp_revista_referencia, camp_revista_data, camp_revista_foto, camp_revista_titol, camp_revista_text, camp_revista_paginici, camp_revista_seccio
FROM taula_revista
WHERE camp_revista_paginici = 'si'
)
ORDER BY DATA DESC
LIMIT 0 , 25;
O bien, si te da error, déjalos tomando la resultante de la consulta como una tabla y asigándole un alias:
Código:
CREATE VIEW inici AS SELECT * FROM (
(
SELECT camp_secretaria_referencia AS referencia, camp_secretaria_data AS
DATA , camp_secretaria_foto AS foto, camp_secretaria_titol AS titol, camp_secretaria_text AS text, camp_secretaria_paginici AS paginici, camp_secretaria_seccio AS seccio
FROM taula_secretaria
WHERE camp_secretaria_paginici = 'si'
)
UNION (
.
etc
.
UNION (

SELECT camp_revista_referencia, camp_revista_data, camp_revista_foto, camp_revista_titol, camp_revista_text, camp_revista_paginici, camp_revista_seccio
FROM taula_revista
WHERE camp_revista_paginici = 'si'
)
ORDER BY DATA DESC
LIMIT 0 , 25
)  as Tabla1;
De todos modos te digo que realizar 25 uniones de tablas me parece una falta de optimización exagerada.
Debería haber una forma mejor.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 07/06/2008, 14:45
 
Fecha de Ingreso: octubre-2007
Mensajes: 57
Antigüedad: 16 años, 6 meses
Puntos: 0
Respuesta: Ahorrar código creando nueva tabla

No funciona de ninguna de las maneras. Después de profundizar más en la documentación de MySQL, he comprobado que la función CREATE VIEW está operativa desde MySQL 5.0.1. Creo que debe ocurrir que la versión del servidor es anterior. Gracias en cualquier caso.
  #5 (permalink)  
Antiguo 07/06/2008, 15:22
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Ahorrar código creando nueva tabla

Es posible que sea ese el problema. De todos modos fíjate bien en el manual de referencia, porque las vistas tienen cierto tipo de restricciones, como por ejemplo que no puede haber una subconsulta en el FROM... por lo cual la segunda opción que te puse no funciona en las vistas (mea culpa, lo olvidé por un momento).
Capítulo 21. Vistas (Views)
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:18.