sql >> Base de Datos >  >> RDS >> Mysql

orden sql complejo por

Supongo que "id de respuesta" es 0 para artículos y es el número de artículo para comentarios. Si ese es su diseño, esto debería funcionar:

select * from yourTable
order by
  case when "reply id" = 0 then id else "reply id" end, id

AÑADIDO: Gracias por la información adicional en tu comentario. Poner los resultados en el orden que deseas no es tan fácil, porque la primera clave de ordenación es la fecha_de_creación de la publicación que inicia el hilo. Esto no está en la fila de datos, por lo que necesita una combinación. Esta es mi mejor suposición basada en la información adicional (que aún no es lo suficientemente completa como para evitar que adivine):

select
  f.id, f.user_id, f.type, f.reply_id, f.text, f.url, f.created_date,
  coalesce(parentfeed.created_date,f.created_date) as thread_date
from feed as f left outer join feed as parentfeed
on f.reply_id = parentfeed.id
order by
  thread_date desc,
  case when f.reply_id = 0 then 0 else 1 end,
  created_date desc, id;

Es posible que deba ajustar la sintaxis para postgre. Probé esto en SQL Server.

Si esto aún no hace lo que desea, sea específico acerca de cómo desea recuperar los datos. Preferiblemente, dígame el orden de "id" que debo ver para los datos en su archivo de volcado, y también explicar la base de esa orden. Esto es lo que hice:

  1. Todos los mensajes en un hilo (hilo =un mensaje y sus comentarios) deben agruparse.

  2. Dentro de un hilo, coloque el mensaje en la parte superior, seguido de sus comentarios en orden cronológico inverso. El subproceso con la fecha/_de creación más reciente debe ser el primero, luego el subproceso con la segunda fecha_de_creación más reciente, y así sucesivamente. (Sus datos de muestra tenían muchos comentarios con la misma fecha_de_creación, por lo que usé "id" como clave de orden secundaria para los comentarios dentro de un hilo).

Nota: Su volcado indica que created_date se actualiza a CURRENT_TIMESTAMP si se modifica una publicación. Si se trata de un tablero de mensajes en vivo, tenga en cuenta que esto podría causar que los comentarios tengan una fecha anterior el mensaje principal, y significa que un hilo permanecerá en la parte superior si se modifica con frecuencia (incluso sin cambios reales en su texto). (Eso no es relevante para mi solución, pero pensé que valía la pena señalarlo).

Debido a que se requiere una unión, esta consulta ahora será mucho más lenta. Mi sugerencia:mantenga dos columnas de fecha, "thread_last_modified" y "item_last_modified". Tendrá que actualizar en cascada desde los iniciadores de hilo hasta los comentarios, pero creo que vale la pena si no hay muchas actualizaciones, porque la consulta puede ser mucho más simple. No he probado esto porque requiere varios cambios en su diseño:

select
  id, user_id, type, reply_id, text, url, thread_last_modified, item_last_modified
from feed
order by
  thread_last_modified desc,
  case when f.reply_id = 0 then 0 else 1 end,
  item_last_modified desc, id;

AÑADIDO #2 :Si solo desea el hilo que contiene el comentario con id ::thisOne, creo que puede agregar esta línea entre las cláusulas ON y ORDER BY (para mi primera solución agregada, la unión):

where parentfeed.id = (
  select coalesce(reply_id,id)
  from feed
  where id = ::thisOne
)

En teoría, esta búsqueda debe evaluarse solo una vez para la consulta, pero si no es así en la práctica, podría precalcularla como ::thisOneThreadID y agregar

where parentfeed.id = ::thisOneThreadID

Para la segunda solución, suponiendo que vuelva a calcular previamente, intente

where coalesce(id,reply_id) = ::thisOneThreadID

Por cierto, sospecho que mis dos soluciones fusionarán hilos que se modificaron por última vez exactamente al mismo tiempo...