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

[SOLUCIONADO] usar union o alias

Estas en el tema de usar union o alias en el foro de Mysql en Foros del Web. Es una duda que tengo, que forma es mas efectiva para hacer una sulta a 17 tablas diferentes pero con los mismos campos Por ejemplo ...
  #1 (permalink)  
Antiguo 27/06/2013, 16:18
 
Fecha de Ingreso: septiembre-2011
Ubicación: España
Mensajes: 118
Antigüedad: 12 años, 6 meses
Puntos: 0
usar union o alias

Es una duda que tengo, que forma es mas efectiva para hacer una sulta a 17 tablas diferentes pero con los mismos campos
Por ejemplo quiero saber si existe el nombre 'pepe' en las 17 tablas que tengo
O si alguien sabe de uan forma mejor lo escucho, gracias


Código PHP:
Ver original
  1. $usuarios = SELECT nombre,edad FROM alumnos1  where edad='20'
  2.                  union
  3.                  SELECT nombre,edad FROM alumnos2  where edad='20'
  4.                  limit 1
  5.  
  6.  
  7. $usuarios = SELECT alumnos1.nombre,alumnos1.edad,
  8.                                  alumnos2.nombre,alumnos2.edad
  9.                     FROM alumnos1,alumnos2  where edad='20'
  10.                     limit 1
  #2 (permalink)  
Antiguo 27/06/2013, 16:33
Avatar de dontexplain  
Fecha de Ingreso: junio-2012
Mensajes: 536
Antigüedad: 11 años, 10 meses
Puntos: 127
Respuesta: usar union o alias

Para eso existe el UNION, para unir consultas SELECT de los mismos campos.

Recuerda que si no especificas UNION ALL sólo retornará aquellas consultas que tengan resultados y omitirá las que no, lo cual puede ser perjudicial si usas la posicionalidad.

También recuerda que para unir varios SELECT con cláusulas LIMIT o GROUP BY hace falta usar paréntesis a cada consulta

La diferencia con respecto a segunda consulta en que especificas comas para separar los datos, con respecto a un UNION, es que el UNION retorna cada SELECT en una fila diferente mientras que retornar varias columnas de varias tablas hace que aparezca el total en cada fila, como JOIN.
__________________
21añero.
HTML/CSS, PHP, JS/jQuery, Mysql; NodeJS/Socket.io (& V8); C++ ; Python (wxpy); Ensamblador.
Músico (clarinetista/pianista) y compositor

Última edición por dontexplain; 27/06/2013 a las 16:46
  #3 (permalink)  
Antiguo 28/06/2013, 04:52
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: usar union o alias

Sin discutir las aportaciones de nadie te recomiendo la lectura de las fuentes

http://dev.mysql.com/doc/refman/5.0/es/union.html

http://dev.mysql.com/doc/refman/5.0/es/join.html

Union y JOIN (con la sintaxis que sea, pero mejor usa JOIN...ON) NO TIENEN NADA QUE VER

Por otro lado esta query

Código MySQL:
Ver original
  1. SELECT alumnos1.nombre,alumnos1.edad,
  2.                                  alumnos2.nombre,alumnos2.edad
  3.                    FROM alumnos1,alumnos2  where edad='20'
  4.                    limit 1

va a dar un error por ambigüedad de campos puesto que el campo "edad" de la clausula WHERE puede ser de las dos tablas y no defines cual quieres evaluar.

Segundo, cuando hayas solucionado lo anterior, como no estableces ninguna relación entre las dos tablas va a generar un producto cartesiano entre las dos tablas, lo que puede llegar a generar una cantidad ingente de registros.
(Todos los registros de la primera tabla emparejados con todos los de la segunda, no veas si son 17 tablas)

Y esta

Código MySQL:
Ver original
  1. SELECT nombre,edad FROM alumnos1  where edad='20'
  2.                  union
  3.                  SELECT nombre,edad FROM alumnos2  where edad='20'
  4.                  limit 1

Te va a retornar la union de TODOS los registros de alumnos1 que tengan 20 años y el primero que encuentre de esa misma edad de alumnos2 (no siempre será el mismo!!!).

Además la edad es algo no estático, con lo que si tardas mucho te dará los mismos registros pero los alumnos quizás ya tengan 21. (Hay que guardar la fecha de nacimiento, nunca la edad).

La solución usando solo Sql es UNION pero yo investigaría alguna con programación externa que no obligue al servidor a leer la 17 tablas, si lo que quieres es encontrar un caso cuando hayas encontrado el primero no hace falta que busques mas, no?

Por otro lado 17 tablas con los mismos campos me hace pensar en algún error de diseño.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 28/06/2013 a las 05:18
  #4 (permalink)  
Antiguo 28/06/2013, 04:56
 
Fecha de Ingreso: septiembre-2011
Ubicación: España
Mensajes: 118
Antigüedad: 12 años, 6 meses
Puntos: 0
Respuesta: usar union o alias

Bueno osea al final con JOIN es lo mejor, yo que intento escapar de eso ya que no lo entiendo por mucho que lo intente buffff

Nada comertar que lo de la edad lo puse amodo de ejemplo, buscara por el email

Si quiero eso que cuando encuetre lo que busco pare de ejecutarla consulta, que no siga buscando


Una pregunta usando UNION, yo creia que al poner el LIMIT se ejecuta el primer SELET y si encuentra lo que busco ya no se ejecutara el SELECT siguiente

Es asi o me equiboco y se ejecuntan todos los select SI o SI aunque tenga el LIMIT?

Tengo creadas 17 tablas para agilizar mas las consultas, para no tener solo una tabla con todos los usuarios
Asi una vez sepa en que tabla esta el email que busco en adelante ya ira diretamente a consultar esa tabla y no las 17

Última edición por diegohugogallego; 28/06/2013 a las 05:46
  #5 (permalink)  
Antiguo 28/06/2013, 05:52
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: usar union o alias

Cita:
Bueno osea al final con JOIN es lo mejor, yo que intento escapar de eso ya que no lo entiendo por mucho que lo intente buffff
Pues no

Cita:
La solución usando solo Sql es UNION pero yo investigaría alguna con programación externa que no obligue al servidor a leer la 17 tablas, si lo que quieres es encontrar un caso cuando hayas encontrado el primero no hace falta que busques mas, no?
Cita:
Una pregunta usando UNION, yo creia que al poner el LIMIT se ejecuta el primer SELET y si encuentra lo que busco ya no se ejecutara el SELECT siguiente
Limit limita los registros de la consulta donde este

Consulta sin limit
UNION
Consulta con limit

!!!!
otra cosa seria

(Consulta con o sin limit)
UNION
(Consulta con o sin limit)
limit

como ya te han dicho.

Cita:
Tengo creadas 17 tablas para agilizar mas las consultas, para no tener solo una tabla con todos los usuarios
Asi una vez sepa en que tabla esta el email que busco en adelante ya ira diretamente a consultar esa tabla y no las 17
Pues lo dicho un error de diseño, una sola tabla con los indices adecuados es mucho mas eficiente.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 28/06/2013 a las 06:02
  #6 (permalink)  
Antiguo 28/06/2013, 06:04
 
Fecha de Ingreso: septiembre-2011
Ubicación: España
Mensajes: 118
Antigüedad: 12 años, 6 meses
Puntos: 0
Respuesta: usar union o alias

utilizo MySQL

Dices entonces que mejor tener una tabla con un millon de registros

A tener por ejemplo 10 tablas con cien mil registros cada una


Yo uso como primary key el email, que es por donde realizo la busqueda

A que te refieres con
Cita:
pero yo investigaría alguna con programación externa que no obligue al servidor a leer la 17 tablas
Como se puede hacer para que cuando encuentre un registro deje de buscar enviando una solo consulta al servidor




por que podia poner alguna sentencia en php, algo asi

SELECT nombre,edad FROM alumnos1 WHERE edad='20' LIMIT 1
if(sino encontro nada que busque en la siguiente tabla){SELECT nombre,edad FROM alumnos2 WHERE edad='20' LIMIT 1}
if(sino encontro nada que busque en la siguiente tabla){SELECT nombre,edad FROM alumnos3 WHERE edad='20' LIMIT 1}
...
..
..
.
asi asta 17 tablas


¿seria eso mejor que la union, aunque se tenga que conectar a BD X veces?

Última edición por diegohugogallego; 28/06/2013 a las 06:12
  #7 (permalink)  
Antiguo 28/06/2013, 06:34
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: usar union o alias

Cita:
programación externa
Es off-topic de este foro. Además no se que usas luego no te puedo indicar....

La idea, seria esa, un bucle que haga todas las consultas secuencialmente pero con un break en el momento que encuentre el primer resultado.

Pero incluso con un millón de registros y el propio índice que conlleva el hecho de ser PK seria más eficiente.

Imagina que el email que buscas esta en la última tabla que vas a consultar.

Si es una sola tabla el índice evita que se lea desde el principio. Va directamente al nodo donde se encontraría el posible resultado con lo que lee muchos menos registros. Cuando tu buscas manualmente en un diccionario empiezas por la primera pagina o vas directamente al la letra inicial de la palabra buscada?

Por otro lado NO busques primero la PK y luego los datos, cuando encuentres la PK coge los datos y no vuelvas a hacer otra búsqueda.

En el momento de ingresar un nuevo email si es una sola tabla simplemente insertalo si tiene exito es que no estaba y sino la query te retorna falso indicando que ya estaba... sin busquedas previas.

Con más registros existe la partición de las tablas que no consiste en hacer varias tablas iguales si no que el propio motor organiza los datos como si fueran varias tablas pero siguen siendo la misma. Si quieres investigar busca por PARTICIÓN de tablas....es optimo con datos organizados por fechas dudo que sirva con el email....o si de hecho es lo mismo... pero nunca dividas arbitariamente una tabla en otras n tablas similares de forma manual, con la idea de leer menos registros..
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 28/06/2013 a las 07:19
  #8 (permalink)  
Antiguo 28/06/2013, 07:00
 
Fecha de Ingreso: septiembre-2011
Ubicación: España
Mensajes: 118
Antigüedad: 12 años, 6 meses
Puntos: 0
Respuesta: usar union o alias

pues si que aprendo cosas nuevas hoy, ose a que si yo tengo un indice numerico como PK y quiero que me muestre el registro 120, segun dices tu ya la BD seria tan lista como para ir directamente a dicho registro, sin leer los anteriores

Con un bucle While valdria verda

utilizo MySQL phpMyAdmin


No entiendo lo que me quieres decir con
Cita:
Por otro lado NO busques primero la PK y luego los datos, cuando encuentres la PK coge los datos y no vuelvas a hacer otra búsqueda.
asi le dijo que me muestre los datos de ese ID no?

SELECT nombre,edad FROM alumnos2 WHERE edad='20' LIMIT 1
  #9 (permalink)  
Antiguo 28/06/2013, 07:29
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: usar union o alias

Cita:
pues si que aprendo cosas nuevas hoy, ose a que si yo tengo un indice numerico como PK y quiero que me muestre el registro 120, segun dices tu ya la BD seria tan lista como para ir directamente a dicho registro, sin leer los anteriores
Si mas o menos, el ejemplo claro es el del diccionario, pero con un indice numerico hace lo mismo. Tu tambien lo harias si buscas la pagina 120 de un libro que haces empezar por la primera e ir pasando paginas?

En cuanto a no buscar primero la pk y luego los datos, es por lo que se desprende de lo que dicias tu primero buscas la PK para saber en que tabla esta y luego ya iras directamente a esa tabla para las siguientes consultas...

Cita:
asi le dijo que me muestre los datos de ese ID no?

SELECT nombre,edad FROM alumnos2 WHERE edad='20' LIMIT 1
En esa consulta no interviene ningun id pero si en vez de edad fuera id, si de esa forma pedirias los datos del id 20 (sin los apostrofes si es numerico)
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #10 (permalink)  
Antiguo 28/06/2013, 13:51
 
Fecha de Ingreso: septiembre-2011
Ubicación: España
Mensajes: 118
Antigüedad: 12 años, 6 meses
Puntos: 0
Respuesta: usar union o alias

quimfv gracias por todo perdon por no contestar antes pero no estaba en casa

doy el tema por zanjado ya que preguntas tengo a miles jee

gracias un saludo

Etiquetas: alias, campo, select, tabla, union, usar
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:12.