当前位置: 首页 > 面试题库 >

复杂的SQL顺序

韩征
2023-03-14
问题内容
id    |    message    |    reply id    |    date

1     |  my new app.. |     0          | 10 / 10 / 2009 (latest message on top, follow by replies)
5     | love ur app.. |     1          | 11 / 10 / 2009 (this should show under the main message)
6     | another comm  |     1          | 12 / 10 / 2009
2     | application 2 |     0          | 09 / 10 / 2009
3     | reply of 2    |     2          | 11 / 10 / 2009

我想在主要评论之后显示最新评论及其回复。显然,答复将具有最新日期,因此我无法按日期对日期进行排序,因为答复将位于主要日期之上。我不确定如何通过一个查询正确执行此操作。任何想法都可以。

数据库转储:http :
//pastie.org/576963


问题答案:

我猜文章的“回复ID”为0,评论的文章号为。如果这是您的设计,这应该可以工作:

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

添加: 感谢您在评论中提供其他信息。将结果按所需顺序排列并非易事,因为第一个排序键是thread-
starter帖子的created_date。它不在数据行中,因此您需要一个联接。这是我根据其他信息得出的最佳猜测(该信息仍然不够完整,无法猜测):

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;

您可能需要调整postgre的语法。我在SQL Server中对此进行了测试。

如果仍然不能满足您的要求,请具体说明如何恢复数据。最好,告诉我“ID”为了我应该看到在你的转储文件的数据, 说明该订单的基础。这是我所做的:

  1. 线程中的所有消息(线程=一条消息及其注释)都应分组在一起。

  2. 在一个线程中,将消息放在顶部,然后按相反的时间顺序排列其注释。具有最新创建/日期的线程应该位于第一个,然后具有第二创建日期最新的线程,依此类推。(您的样本数据有许多具有相同created_date的注释,因此我在线程中使用“ id”作为注释的第二顺序键。)

注意:
您的转储表明,如果帖子被修改,则created_date会更新为CURRENT_TIMESTAMP。如果这是一个实时留言板,请注意,这可能会导致注释在父消息
之前 过时,这意味着如果一个线程经常被修改(即使对其文本没有实际更改),它也将停留在最前面。(这与我的解决方案无关,但我认为这是值得注意的。)

因为需要联接,所以此查询现在会慢很多。我的建议:保留两个日期列,即“ thread_last_modified”和“
item_last_modified”。您将不得不将更新从线程启动器级联到注释级联,但是如果没有太多更新,那是值得的,因为查询可以简单得多。我尚未对此进行测试,因为它需要对您的设计进行几处更改:

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;

添加#2 :如果只希望包含ID为:: thisOne的注释的线程,我认为您可以在ON和ORDER
BY子句之间添加此行(对于我的第一个添加的解决方案,是join):

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

从理论上讲,该查询只应对查询进行一次评估,但如果实际中不可行,则可以将其预先计算为:: thisOneThreadID并添加

where parentfeed.id = ::thisOneThreadID

对于第二种解决方案,假设您再次进行预计算,请尝试

where coalesce(id,reply_id) = ::thisOneThreadID

顺便说一句,我怀疑我的两个解决方案都将在同一时间合并上次修改的线程…



 类似资料:
  • 什么是 Nutz.Dao 中的复杂SQL条件 对于 Nutz.Dao 来说,它本质上就是将你的 Java 对象转化成 SQL,然后交给 JDBC 去执行。 而 SQL 中,当执行数据删除和查询操作时,最常用的就是 WHERE 关键字。 WHERE 关键字后面的就是所谓的复杂查询条件 Nutz.Dao 将如何如何使用这个条件 Dao 接口的 clear 方法和 query 方法的第二个参数,就是为了

  • 我有下表在OracleSQL方言(被调用与一些java代码) 我正在寻找一种方法来进行以下分类: 将part、locker、serial#组合在一起,并在每个组内按升序或降序对描述进行排序,同时确保每个组的第一条记录也按升序或降序正确排序(冲突应按part、locker、serial的所需顺序排序)。例如: 排序DESC将产生: 如何实现这种复杂的排序类型?仅仅通过查询就可以吗?

  • 如何将这个复杂的sql语句更改为JPQL? 这是否可以在JPQL表单中显示?

  • 问题内容: 基本上我有相册,其中包含50张图像init。.现在,如果我显示图像列表,我知道从哪一行显示(显示:50的20到30),意味着从20到30显示10行。问题是,我想选择一个图像,但仍然显示它选择了哪个位置,因此我可以来回移动,但也要保持该位置。 就像如果我选择第5张图像,其ID为’sd564’,我想显示(50张图像中的6张),表示您正在看到50张图像中的6张..如果我得到下一行ID并显示,

  • 问题内容: 我有以下JS对象: 我需要在上述对象上执行此SQL查询: 结果应为: 因为只有该组包含在查询中使用的两个ID。 我找到了有关SQLike和JSLINQ的信息,但是我 在哪里 以及 有 表达式时遇到了问题。是否有可能使用SQL-JS库或JS / jQuery本身(编写函数等)在javascript对象上执行此类查询? 问题答案: Alasql JavaScript SQL库是专门为此类任

  • 数据-我使用XML中的许多附加列获取此类数据,并使用com。databricks spark-xml\u 2.11库,用于将xml数据转换为数据帧。 要求-必须从数组(struct)类型或列custom\u属性转换数据。示例中的custom\u属性,如示例输出所示。My struct有三个字段,分别命名为“\u VALUE”、“属性\u id”、“值”。我需要将属性id转换为列名称,数据为-检查“