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

Dos o mas campos devueltos por subselect

Estas en el tema de Dos o mas campos devueltos por subselect en el foro de Mysql en Foros del Web. Buenas gente :) Estoy haciendo un select que tiene un subselect. Necesito que dicho subselect me devuelva dos o mas campos, de la siguiente manera: ...
  #1 (permalink)  
Antiguo 30/06/2011, 11:35
Avatar de nicolaslt  
Fecha de Ingreso: abril-2009
Ubicación: Buenos Aires, Argentina
Mensajes: 119
Antigüedad: 15 años
Puntos: 5
Pregunta Dos o mas campos devueltos por subselect

Buenas gente :)

Estoy haciendo un select que tiene un subselect. Necesito que dicho subselect me devuelva dos o mas campos, de la siguiente manera:

Subselect:
Código MySQL:
Ver original
  1. (SELECT contenido,titulo FROM temas WHERE id=max(id))

ese seria el subselect. Necesito la forma de asignarles alias o algo similar a esos campos para poder acceder a ellos.. probé de poner de la siguiente forma pero no dió resultado

Código MySQL:
Ver original
  1. SELECT last.contenido,last.titulo ...
  2. (SELECT contenido,titulo FROM temas WHERE id=max(id)) as last

Tengan en cuenta que estoy poniendo unicamente la parte relevante del subselect.. el query completo es mucho mas largo...

Bueno, gracias desde ya por pasar..

saludos! :)
  #2 (permalink)  
Antiguo 30/06/2011, 12:52
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Dos o mas campos devueltos por subselect

Hola alejandrodlrocha:

Creo que lo que intentas hacer no se puede, no por lo menos de la manera en como lo planteas. Si los subselects va a quedar en la parte del select principal estos sólo pueden devolver un campo, podrías en todo caso hacer lo siguiente:


Código:
SELECT 
(SELECT contenido FROM temas WHERE id=max(id)) contenido
(SELECT titulo FROM temas WHERE id=max(id)) titulo
...
es decir, repetir dos veces el la misma consulta pero obteniendo un campo diferente en cada una de ella... Igual y sería conveniente que nos dieras un panorama más general de cómo son tus tablas y la información que está contenida en ellas, tal vez exista alguna otra manera de obtener lo que quieres hacer.

Saludos
Leo.
  #3 (permalink)  
Antiguo 30/06/2011, 13:30
Avatar de nicolaslt  
Fecha de Ingreso: abril-2009
Ubicación: Buenos Aires, Argentina
Mensajes: 119
Antigüedad: 15 años
Puntos: 5
Respuesta: Dos o mas campos devueltos por subselect

Hola leo, gracias por tu respuesta :)

Supongo que tu código funciona, pero debe bajar bastante el rendimiento hacer un select por cada campo que quiera obtener no??

Igualmente.. yo calculo que esta es la unica forma.. traté de hacerlo mediante joins, una cosa asi:

Código MySQL:
Ver original
  1. SELECT * from ...
  2.  
  3. left join temas as ultimoTema on ultimoTema.id = max(tema.id)

supongo que no se puede hacer eso, nose.. xD

creo que me habia tirado error de sql con esa sintaxis

saludos!
  #4 (permalink)  
Antiguo 30/06/2011, 14:04
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Dos o mas campos devueltos por subselect

Hola de nuevo:

Sigues sin decirnos qué es exactamente lo que pretendes obtener, tampoco nos dices cuál es la estructura de tus tablas ni pones datos de ejemplo... si esta información es difícil sino imposible tratar de encontrar otra alternativa que no afecte tanto el rendimiento del servidor...

Dices que tu calculas o piensas que es la única manera de obtener lo que quieres, lo cual me parece bastante descabellado, siempre podrías por ejemplo recurrir a procedimientos almacenados, funciones e inclusive la opción del INNER JOIN podría adaptarse, pero es necesario que nos dijeras cómo están relacionados tus datos.

Tal pareciera que tienes algo de recelo en mostrar lo que tienes, pero simplemente son datos de ejemplo, no tienen por qué ser datos reales si es lo que te preocupa. Trata de explicar acerca de por qué necesitas el valor máximo, cuáles son tus campos llaves y cualquier detalle que nos pueda ayudar. Entre más información nos puedas dar más factible será que yo o cualquier otro forista tenga alguna idea o alternativa.

Saludos
Leo.
  #5 (permalink)  
Antiguo 30/06/2011, 14:23
Avatar de nicolaslt  
Fecha de Ingreso: abril-2009
Ubicación: Buenos Aires, Argentina
Mensajes: 119
Antigüedad: 15 años
Puntos: 5
Respuesta: Dos o mas campos devueltos por subselect

No es que tenga recelo de mostrarlo.. es que simplemente me parecio que era ensuciar la sintaxis ocon datos no relevantes...

si queres pongo la estructura. no tengo problema leo..

la cosa seria asi.. es un simple foro

Subforos
---------
ID
Nombre

categorias
----------
ID
Subforo_ID
Nombre

Temas
--------
ID
Titulo
categoria_id

los subforos contienen categorias, las categorias c ontienen temas..


la sección donde esta el problema que postié acá es.. en la portada del foro, donde muestro todos los subforos y todas las categorias.
lo que estoy tratando de ahcer con el subselect es.. mostrar el ultimo tema de cada categoria..


Código MySQL:
Ver original
  1. SELECT *,(SELECT titulo FROM temas WHERE id=max(tema.id)) AS ultimoTitulo,max(tema.id) as ultimoID
  2.     FROM subforos as sub
  3.     left join categorias as cat ON cat.sub=sub.id
  4.     left join temas as tema on tema.categoria=cat.id
  5.     GROUP BY(cat.id)
  6.     ORDER BY sub.posicion,cat.posicion ASC

saludos! :)

Última edición por nicolaslt; 30/06/2011 a las 14:48
  #6 (permalink)  
Antiguo 30/06/2011, 15:16
Avatar de Nano_  
Fecha de Ingreso: febrero-2006
Ubicación: Bogotá, Colombia
Mensajes: 1.866
Antigüedad: 18 años, 2 meses
Puntos: 96
Respuesta: Dos o mas campos devueltos por subselect

Saludos

No entiendo por que necesitas del subselect, acaso realizandolo de la siguiente manera no obtienes lo que necesitas?

Código MySQL:
Ver original
  1. SELECT cat.id,cat.nombre, tema.titulo AS ultimoTitulo,tema.id as ultimoID
  2.         FROM subforos as sub
  3.         INNER JOIN categorias as cat ON cat.sub=sub.id
  4.         INNER JOIN temas as tema on tema.categoria=cat.id
  5.         GROUP BY(cat.id)
  6.         ORDER BY tema.id DESC
__________________
:.:Nano.:: @nano_hard - Retornando al foro
  #7 (permalink)  
Antiguo 30/06/2011, 15:18
Avatar de nicolaslt  
Fecha de Ingreso: abril-2009
Ubicación: Buenos Aires, Argentina
Mensajes: 119
Antigüedad: 15 años
Puntos: 5
Respuesta: Dos o mas campos devueltos por subselect

Hola nano, gracias por tu respuesta..

El join que selecciona de temas.. selecciona toooodos los temas de cada categoría, mientras que el subselect selecciona unicamente el ultimo tema de cada categoria.. es por eso que selecciono dos veces desde temas...

una vez mas gracias..

saludso!
  #8 (permalink)  
Antiguo 30/06/2011, 15:36
Avatar de Nano_  
Fecha de Ingreso: febrero-2006
Ubicación: Bogotá, Colombia
Mensajes: 1.866
Antigüedad: 18 años, 2 meses
Puntos: 96
Respuesta: Dos o mas campos devueltos por subselect

Saludos

Te entiendo entonces coloca el subselect dentro del JOIN

Código MySQL:
Ver original
  1. SELECT cat.nombre, tema.titulo AS ultimoTitulo,tema.id as ultimoID
  2.         FROM subforos as sub
  3.         LEFT JOIN categorias as cat ON cat.sub=sub.id
  4.         LEFT JOIN (SELECT MAX(id)  
  5.                  FROM temas GROUP BY id)
  6.         as tema ON tema.categoria=cat.id
  7.         ORDER BY cat.id DESC

Seria que lo probaras
__________________
:.:Nano.:: @nano_hard - Retornando al foro
  #9 (permalink)  
Antiguo 01/07/2011, 11:50
Avatar de nicolaslt  
Fecha de Ingreso: abril-2009
Ubicación: Buenos Aires, Argentina
Mensajes: 119
Antigüedad: 15 años
Puntos: 5
Respuesta: Dos o mas campos devueltos por subselect

Buenass... les hablo para avisarles que modifiqué un poco el código cosa que funcione y tampoco baje mucho el rendimiento..

Me sirvió mucho de guía lo que me sugirió nano..

así quedó el join para seleccionar el ultimo tema:

Código MySQL:
Ver original
  1. left join temas as utema ON utema.id = (SELECT MAX(tema.id) FROM temas WHERE tema.categoria=cat.id)

muchas gracias a nano y a leo por sus respuestas :)

saludos!!

Etiquetas: campos, subquery, subselect
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:41.