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

Duda sobre esta consulta

Estas en el tema de Duda sobre esta consulta en el foro de Mysql en Foros del Web. Hola amigos, navegando por internet buscando info sobre una duda me he encontrado esto, ya lo he visto un par de veces pero no llego ...
  #1 (permalink)  
Antiguo 24/07/2014, 10:23
Avatar de Benderzuelo  
Fecha de Ingreso: mayo-2013
Ubicación: España
Mensajes: 223
Antigüedad: 11 años
Puntos: 5
Duda sobre esta consulta

Hola amigos, navegando por internet buscando info sobre una duda me he encontrado esto, ya lo he visto un par de veces pero no llego a entenderlo, es un Select y después del FROM que vendría el nombre de la tabla veo otro select, alguien me lo puede explicar por favor.

Código SQL:
Ver original
  1. SELECT t.article
  2. FROM
  3.     (SELECT article, publish_date
  4.      FROM table1
  5.      ORDER BY publish_date DESC LIMIT 10) t
  6.  
  7. ORDER BY t.publish_date ASC;

Muchas gracias por adelantado
  #2 (permalink)  
Antiguo 24/07/2014, 10:26
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, 5 meses
Puntos: 2658
Respuesta: Duda sobre esta consulta

Es una consulta que toma como tabla auna tabla derivada (tabla de resultado de una subconsulta).
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 24/07/2014, 10:38
Avatar de Benderzuelo  
Fecha de Ingreso: mayo-2013
Ubicación: España
Mensajes: 223
Antigüedad: 11 años
Puntos: 5
Respuesta: Duda sobre esta consulta

Gracias por contestar tan rápido gnzsoloyo, pero por favor podrías ampliar más las respuesta?, es que no lo he entendido, no entiendo porque hacer una consulta para que obtenga la tabla de la otra consulta, podríamos poner la tabla directamente no?
  #4 (permalink)  
Antiguo 24/07/2014, 11:13
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, 5 meses
Puntos: 2658
Respuesta: Duda sobre esta consulta

Cita:
no entiendo porque hacer una consulta para que obtenga la tabla de la otra consulta, podríamos poner la tabla directamente no?
La explicación es un poco larga, porque no hay una única razón para haber ese tipo de consultas. Puede ser por performance, por restricciones que no aplican en forma global, podrían tambien ser por subconsultas que aplican a la misma tabla... Como digo, hay muchas razones, y sólo lo aprendes con la práctica.
En el caso puntual del ejemplo que das, la respeuesta es NO. No es lo mismo intentarlo con una sola query, que con una subquery.
Si miras atentamente lo que hace es buscar una lista de los 10 registros más recientes, pero ordenados del mas viejo al mas nuevo. Y son dos ordenamientos incompatibles.
Es imposible hacer eso en una consulta simple.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 24/07/2014, 11:16
Avatar de Benderzuelo  
Fecha de Ingreso: mayo-2013
Ubicación: España
Mensajes: 223
Antigüedad: 11 años
Puntos: 5
Respuesta: Duda sobre esta consulta

Bueno, gracias, pero como sigo sin entenderlo, me puedes decir como se llama este tipo de consultas para buscar en internet?

Saludos
  #6 (permalink)  
Antiguo 24/07/2014, 11:25
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, 5 meses
Puntos: 2658
Respuesta: Duda sobre esta consulta

Ya te lo dije: tabla derivada".

¿Qué es lo que no entiendes de que una subconsulta permite crear una tabla derivada (que "deriva de otra") que puede usarse como origen de datos de otro select?

¿Nucna usate al menos Excel para tomar como fuente de datos a otra hoja?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 24/07/2014, 11:27
Avatar de Benderzuelo  
Fecha de Ingreso: mayo-2013
Ubicación: España
Mensajes: 223
Antigüedad: 11 años
Puntos: 5
Respuesta: Duda sobre esta consulta

No, nunca, a mi me enseñaron solo INSERT, SELECT, UPDATE y DELETE, el resto lo he ido aprendiendo a golpes y pidiendo ayuda como ahora

Lo buscaré, gracias
  #8 (permalink)  
Antiguo 24/07/2014, 11:31
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, 5 meses
Puntos: 2658
Respuesta: Duda sobre esta consulta

¿O sea que NUNCA hiciste una subconsulta?
¿Ni siquiera en el WHERE?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 24/07/2014, 11:33
Avatar de Benderzuelo  
Fecha de Ingreso: mayo-2013
Ubicación: España
Mensajes: 223
Antigüedad: 11 años
Puntos: 5
Respuesta: Duda sobre esta consulta

Si, eso si, por?
  #10 (permalink)  
Antiguo 24/07/2014, 11:47
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, 5 meses
Puntos: 2658
Respuesta: Duda sobre esta consulta

Esbásicamente lo mismo, sólo que al ponerlo en el from lo que obtienes es el resultado de la subconsulta, y sobre ese resultado se aplica la consulta mayor.
No tiene ningñun misterio.
Las únicas condiciones obligatorias son que toda tabla derivada debe tener su propio alias (lo puedes ver en tu ejemplo), y que no puedes invocar ningún campo que no esté expresamente indicado en esa subconsulta. El resto campos, a los efectos de la consulta mayor, no existen.
Toda la operacion se hace en memoria.

Si una tabla TablaA tuviese los campos A, B, C, D y E, pero la ejecutas así:
Código MySQL:
Ver original
  1.     (SELECT A, B, C
  2.     FROM TablaA
  3.     WHERE D = 100 AND E = 'xxxx') TA;
los campos D y E no existen para la consulta exterior, pero sí dentro de la subconsulta.

¿Se entiende?

Para la consulta exterior (mayor) sólo existen las columnas indicadas en el SELECT de la menor. Nada más.

Es raro que jamás te hayan mostrado esto porque es SQL básico. Muy elemental. Está en cualqueir manual de principiantes.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 24/07/2014, 11:59
Avatar de Benderzuelo  
Fecha de Ingreso: mayo-2013
Ubicación: España
Mensajes: 223
Antigüedad: 11 años
Puntos: 5
Respuesta: Duda sobre esta consulta

No estoy seguro porque al no saber mucho de mysql yo lo que espero después e un FROM es un nombre de tabla no un resultado, pero te explico lo que he entendido a ver si es así,

Lo que haces es un SELECT * FROM realmente es a TA o sea SELECT * FROM TA pero en vez de devolverte todo te devolverá solo lo que pides en la sub consulta?

Te explicas muy bien pero es que me faltan conocimientos.
  #12 (permalink)  
Antiguo 24/07/2014, 12:03
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, 5 meses
Puntos: 2658
Respuesta: Duda sobre esta consulta

Cita:
Lo que haces es un SELECT * FROM realmente es a TA o sea SELECT * FROM TA pero en vez de devolverte todo te devolverá solo lo que pides en la sub consulta?
Es exactamente lo que te vengo diciendo desde el principio. Es lo que se denomina "tabla resultado" o más exactamente "tabla derivada".
Y no es algo propio de MySQL. Es de TODOS los DBMS, sea éste, Oracle, DB2, SQL Server, Firebird, PostgreSQL, o cualquier otro que trabaje con SQL.

Cita:
yo lo que espero después e un FROM es un nombre de tabla
Pues eso lo sigues teniendo en realidad, es el alias de la subconsulta.
Por eso en todos los DBMS es obligatorio que la tabla derivada tenga si o sí un alias. De lo contrario te dispararía un error de sintaxis.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #13 (permalink)  
Antiguo 25/07/2014, 01:09
Avatar de Benderzuelo  
Fecha de Ingreso: mayo-2013
Ubicación: España
Mensajes: 223
Antigüedad: 11 años
Puntos: 5
Respuesta: Duda sobre esta consulta

Ok, muchas gracias gnzsoloyo,

ahora lo entiendo, lo que sigo sin entender es para que usarla porque en teoría seria lo mismo que:

Código SQL:
Ver original
  1. SELECT A, B, C  FROM TablaA WHERE D = 100 AND E = 'xxxx'

Se puede hacer directamente también no?
  #14 (permalink)  
Antiguo 25/07/2014, 03:21
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, 5 meses
Puntos: 2658
Respuesta: Duda sobre esta consulta

Eso que te puse es sólo un ejemplo para mostrar ciertas restricciones. No como ejemplo práctico.
Creí que se entendía...

Es obvio que no se trata de un caso de uso.

Pero si te fijas en el que tú pusiste al inicio y que yo te expliqué, no se puede hacer de otro modo.
El resto es algo que vas teniendo que experimentar; simplemente tienes que tener en cuenta que en algún caso puede presentarse una consulta donde la solución efectiva y eficiente pasa por allí.
Como te dije al principio, no hay una única causa, ni tampoco un único escenario por el que sea necesario hacerlo de ese modo. Hay tantas razones como sistemas se puedan crear.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 25/07/2014 a las 06:45

Etiquetas: select, tabla
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 06:01.