Consulta con INNER o IN en una misma tabla

Tengo una tabla con respuestas, cada uno de los cuales tiene una fecha de inserción, cada respuesta depende de una pregunta inicial y se relacionna por un campo idPadre.

Lo que quiero conseguir es que me saque la lista de las preguntas ordenada por la última fecha de las respuestas que pertenecen a cada pregunta.

La tabla es algo como esto:

IdContador, fecha, idPadre, texto

Como he comentado, las preguntas que son preguntas como tal, tienen el idPadre = 0, y sus "hijas" en idPadre, tienen el idContador de la pregutna a la que pertenece. DE esta forma se relacionan.

He hecho una consulta tipo "IN":

SELECT * FROM tblconsulta WHERE idPadre=0 AND intEstado= 2 AND idContador IN (SELECT DISTINCT tblconsulta.idPadre FROM tblconsulta WHERE tblconsulta.idPadre <>  '0' GROUP BY idPadre ORDER BY MAX(fchFecha)  DESC)

Pero IN me devuelve on conjunto desordenado y no me sirve si lo que quiero es sacarlo por orden de la última respuesta...

¿Alguna sugerencia?

1 respuesta

Respuesta
1

Puedes hacer un INNER JOIN consigo misma para luego poder ordenarla:

SELECT p.*, MAX(r.fecha) 
FROM tblconsulta p INNER JOIN tblconsulta r 
ON r.idPadre = p.idContador 
WHERE p.idPadre = 0 AND p.intEstado = 2

Algo así debería funcionarte.

Esa consulta me saca exclusivamente el último valor... h estado jugando con esto:

SELECT  p.idContador AS idactual FROM tblconsulta AS p Inner Join tblconsulta AS r ON r.idPadre = p.idContador WHERE  p.intEstado = 2  ORDER BY r.fchFecha DESC

Pero me saca repetidos los ID por cada respuesta asociada, claro... con un DISTINCT se pierde la ordenación...¿?

Creo que no entiendo muy bien tu pregunta, ¿quieres sacar todas las preguntas y la fecha de la respuesta más reciente? ¿Sacar todas las respuestas de una pregunta concreta ordenado por fecha?

Exactamente sacar todas las preguntas ordenadas por la fecha de la respuesta más reciente.

Entonces es similar a la primera solo que usamos el max(fecha) como order by:

SELECT p.*
FROM tblconsulta p INNER JOIN tblconsulta r 
ON r.idPadre = p.idContador 
WHERE p.idPadre = 0 AND p.intEstado = 2
ORDER BY MAX(r.fecha) DESC

Mmm... casi pero no... sigue sacando solo un resultado... Creo que andamos cerca.... no se si pasa por agrupar los resultados por pregunta...

OK, al final lo resolví:

SELECT DISTINCT( r.idPadre)
FROM tblconsulta r INNER JOIN tblconsulta p
ON r.idPadre = p.idContador
WHERE p.idPadre = 0 AND p.intEstado = 2  GROUP BY r.idPadre
ORDER BY MAX(r.fchFecha) DESC

Efectivamente había que agrupar. Tu respuesta me inspiró a averiguar el resultado. Muchas gracias!

Cierto, ese ORDER BY está mal, deberíamos agrupar por el idContador de la pregunta y coger solo el MAX(fecha) de las respuestas que coincidan:

SELECT p.*, MAX(r.fecha)
FROM tblconsulta p INNER JOIN tblconsulta r 
ON r.idPadre = p.idContador 
WHERE p.intEstado = 2
GROUP BY p.idContador

No hace falta poner en el WHERE que el idPadre sea cero ya que el ON del INNER JOIN ya solo matcheará las preguntas que son las únicas en las que r.idPadre = p.idContador

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas