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

ordenando por "subconsultas" (?)

Estas en el tema de ordenando por "subconsultas" (?) en el foro de Bases de Datos General en Foros del Web. hola.. me disculpo si "subconsulta" no es el término... llevo tiempo practicando con MSsql pero no me adapto facil a la terminología, asi que mejor ...
  #1 (permalink)  
Antiguo 15/01/2003, 22:03
 
Fecha de Ingreso: enero-2002
Ubicación: Bogotá
Mensajes: 23
Antigüedad: 22 años, 3 meses
Puntos: 0
ordenando por "subconsultas" (?)

hola.. me disculpo si "subconsulta" no es el término... llevo tiempo practicando con MSsql pero no me adapto facil a la terminología, asi que mejor paso a describirles lo que tengo y luego lo que intento hacer...

select *,(select count(id) from foro fr2 where fr1.id = fr2.viene) as numrespuestas
from foro fr1
order by numrespuestas desc

estoy usando este codigo para un foro, quisiera que el query ordene los mensajes de dicho foro según el numero de respuestas que tenga, pero ese dato no se encuentra almacenado en la tabla sino que tengo que hacer un conteo en una "subconsulta", lo que sucede es que cuando intento ejecutar esa consulta en mi aplicación, me devuelve error.

lo que quisiera saber es como hago para ordenar por una columna que no existe sino que es producto de una "subconsulta", supongo que con group by podría hacer alñguna cosa, pero he leido la referencia y he intentado varias cosas pero ninguna funciona.

espero me puedan ayudar, es de vital importancia para mí.

saludos,
juan diego
  #2 (permalink)  
Antiguo 16/01/2003, 07:15
Avatar de MCasanova  
Fecha de Ingreso: enero-2002
Ubicación: Concepción, La Perla del BioBio, Chile
Mensajes: 144
Antigüedad: 22 años, 4 meses
Puntos: 0
Juan Diego:

Debes hacer un sólo cambio en tu select, fíjate:

select *,(select count(id) from foro fr2 where fr1.id = fr2.id) as numrespuestas
from foro fr1
order by numrespuestas desc

fr1.id = fr2.id

Espero te resulte, yo la probé con una tabla parecida

Saludos

Manuel
__________________
"La inteligencia consiste no sólo en el conocimiento, sino también en la destreza de aplicar los conocimientos en la práctica", Aristóteles
[img][/img]
  #3 (permalink)  
Antiguo 16/01/2003, 10:40
 
Fecha de Ingreso: enero-2002
Ubicación: Bogotá
Mensajes: 23
Antigüedad: 22 años, 3 meses
Puntos: 0
hmmm...

no sé si eso siirve, el tema es que me estás cambiando totalmente el sentido del query...

de todas formas te agradezco, seguiré intentando o esperando alguna ayuda más
  #4 (permalink)  
Antiguo 16/01/2003, 11:05
Avatar de MCasanova  
Fecha de Ingreso: enero-2002
Ubicación: Concepción, La Perla del BioBio, Chile
Mensajes: 144
Antigüedad: 22 años, 4 meses
Puntos: 0
No te entiendo; cómo cambiando el sentido del query?

Si la select:

select *,(select count(id) from foro fr2 where fr1.id = fr2.id) as numrespuestas
from foro fr1
order by numrespuestas desc

te debería mostrar los mensajes ordenados por id, colocando los más numerosos al principio

A lo mejor no entendí. Es una sola tabla, no es cierto?

Qué es "viene"?

Saludos
__________________
"La inteligencia consiste no sólo en el conocimiento, sino también en la destreza de aplicar los conocimientos en la práctica", Aristóteles
[img][/img]
  #5 (permalink)  
Antiguo 16/01/2003, 15:33
 
Fecha de Ingreso: enero-2002
Ubicación: Bogotá
Mensajes: 23
Antigüedad: 22 años, 3 meses
Puntos: 0
en mi foro hay dos clase de mensajes, digamos:

1- mensajes identificados con su id y viene=0 lo cual le dice a la aplicación que, por ser viene=0 es un mensaje "padre" digamos...

2- mensajes identificados con su id y "viene" igual al id de su mensaje padre... asi se sabe que este mensaje fue una respuesta al mensaje representado en la columna viene

cuando hago el subselect "select count(id) from foro fr2 where fr2.viene = fr1.id" estoy consultando cuantas respuestas o "mensajes hijos" tiene ese mensaje padre y así poder ordenar por esa columna... la idea es que el foro sea ordenable según el gusto del usuario según fecha de creado, fecha de actualizado, nombre del autor, titulo de mensaje, y (en este caso) numero de respuestas.

eso es todo, te agradezco la inquietud
  #6 (permalink)  
Antiguo 17/01/2003, 08:36
Avatar de MCasanova  
Fecha de Ingreso: enero-2002
Ubicación: Concepción, La Perla del BioBio, Chile
Mensajes: 144
Antigüedad: 22 años, 4 meses
Puntos: 0
Ahora entiendo, y no se me ocurre como podrías hacerlo en una sola select.

Lo que deberías hacer y que te facilitaría futuras consultas, creo yo, es normalizar tu bd, es decir crear dos tablas:

Una con los mensajes padre que tendría dos campos, a lo menos, id y mensaje y

una con las respuestas que tendría tres campos, a lo menos, el id, nroresp y respuesta.

De esta manera la siguiente select te entregaría los mensajes padre ordenados por cantidad de respuestas:

select a.id,mensaje,count(*) as cuenta
from tpadre a,trespuesta b
where a.id = b.id
group by a.id,mensaje
order by cuenta desc

Esa sería mi contribución que espero te sirva o te dé alguna luz para solucionar tu problema

Saludos
__________________
"La inteligencia consiste no sólo en el conocimiento, sino también en la destreza de aplicar los conocimientos en la práctica", Aristóteles
[img][/img]
  #7 (permalink)  
Antiguo 17/01/2003, 10:11
 
Fecha de Ingreso: enero-2002
Ubicación: Bogotá
Mensajes: 23
Antigüedad: 22 años, 3 meses
Puntos: 0
muchas gracias por tu colaboración... me hubiera servido tu ultima sugerencia pero la tabla ya contiene bastantes mensajes y la programación tiene muchas lineas de código,

asi que opté por crear nuevos campos dentro de mi tabla asi: fechamodificado, numrespuestas, etc.... y esos campos se actualizan cada tanto, asi la consulta resulta más rapida y sencilla.

saludos,
juan diego
http.//www.circulodebaba.com
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 03:13.