- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
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
我想在主要评论之后显示最新评论及其回复。显然回复会有最新日期,所以我不能按日期排序,因为回复将在 main 之上。我不确定如何通过一个查询正确执行此操作。请有任何想法。
数据库转储:http://pastie.org/576963
最佳答案
我猜文章的“reply id”是0,是评论的文章编号。如果那是您的设计,那么这应该可行:
select * from yourTable
order by
case when "reply id" = 0 then id else "reply id" end, id
已添加:感谢您在评论中提供更多信息。将结果按您想要的顺序放置并不是那么容易,因为第一个排序键是 thread-starter post 的 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”顺序,并还解释该顺序的基础。这是我所做的:
线程中的所有消息(线程 = 一条消息及其评论)应该组合在一起。
在一个线程中,将消息放在最前面,然后按时间倒序排列其评论。具有最近 created/_date 的线程应该排在第一位,然后是具有第二个最新 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;
ADDED #2:如果您只想要包含 id 为::thisOne 的评论的线程,我认为您可以在 ON 和 ORDER BY 子句之间添加这一行(对于我添加的第一个解决方案,连接):
where parentfeed.id = (
select coalesce(reply_id,id)
from feed
where id = ::thisOne
)
理论上,这个查找应该只对查询求值一次,但如果在实践中不是这样,您可以将它预先计算为::thisOneThreadID 并添加
where parentfeed.id = ::thisOneThreadID
对于第二种方案,假设你再次预计算,试试
where coalesce(id,reply_id) = ::thisOneThreadID
顺便说一句,我怀疑我的两个解决方案都会合并最后一次修改的线程...
关于sql - 复杂的sql排序依据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1250070/
SQL、PL-SQL 和 T-SQL 之间有什么区别? 谁能解释一下这三者之间的区别,并提供每一个的相关使用场景? 最佳答案 SQL 是一种对集合进行操作的查询语言。 它或多或少是标准化的,几乎所有关
这个问题已经有答案了: What is the difference between SQL, PL-SQL and T-SQL? (6 个回答) 已关闭 9 年前。 我对 SQL 的了解足以完成我的
我在数据库中有一个 USER 表。该表有一个 RegistrationDate 列,该列有一个默认约束为 GETDATE()。 使用 LINQ 时,我没有为 RegistrationDate 列提供任
我有一个可能属于以下类型的字符串 string expected result 15-th-rp 15 15/12-rp 12 15-12-th
很难说出这里问的是什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或言辞激烈,无法以目前的形式合理回答。如需帮助澄清此问题以便可以重新打开,visit the help center . 9年前关闭
我有一个存储过程(称为 sprocGetArticles),它从文章表中返回文章列表。这个存储过程没有任何参数。 用户可以对每篇文章发表评论,我将这些评论存储在由文章 ID 链接的评论表中。 有什么方
我目前正在做一个 *cough*Oracle*cough* 数据库主题。讲师介绍embedded SQL作为让其他语言(例如 C、C++)与(Oracle)数据库交互的方式。 我自己做了一些数据库工作
SQL Server 中 SQL 语句的最大长度是多少?这个长度是否取决于 SQL Server 的版本? 例如,在 DECLARE @SQLStatement NVARCHAR(MAX) = N'S
这个问题已经有答案了: Simple way to transpose columns and rows in SQL? (9 个回答) 已关闭 8 年前。 CallType
预先感谢您对此提供的任何帮助。 假设我有一个查询,可以比较跨年的数据,从某个任意年份开始,永无止境(进入 future ),每年同一时期直到最后一个完整的月份(其特点是一月数据永远不会显示至 2 月
我在数据库中有一个 USER 表。该表有一个 RegistrationDate 列,该列的默认约束为 GETDATE()。 使用 LINQ 时,我没有为 RegistrationDate 列提供任何数
下面是我试图用来检查存储过程是否不存在然后创建过程的 sql。它会抛出一个错误:Incorrect syntax near the keyword 'PROCEDURE' IF NOT EXISTS
我有一个同事声称动态 SQL 在许多情况下比静态 SQL 执行得更快,所以我经常看到 DSQL 到处都是。除了明显的缺点,比如在运行之前无法检测到错误并且更难阅读,这是否准确?当我问他为什么一直使用
来自 lobodava 的动态 SQL 查询是: declare @sql nvarchar(4000) = N';with cteColumnts (ORDINAL_POSITION, CO
使用 SQL Server 中的存储过程执行动态 SQL 命令的现实优点和缺点是什么 EXEC (@SQL) 对比 EXEC SP_EXECUTESQL @SQL ? 最佳答案 sp_executes
我有这个有效的 SQL 查询: select sum(dbos.Points) as Points, dboseasons.Year from dbo.StatLines dbos i
我正在调试一些构建成功运行的 SQL 命令的代码。 然而,在查询结束时,查询结果似乎被写入了一个文本文件。 完整的查询如下 echo SELECT DATE,DATETABLE,DATE,APPDAT
我有一些创建表的 .sql 文件(MS SQL 数据库): 表_1.sql: IF OBJECT_ID (N'my_schema.table1', N'U') IS NOT NULL DROP TAB
我写了下面的 SQL 存储过程,它一直给我错误@pid = SELECT MAX(... 整个过程是: Alter PROCEDURE insert_partyco @pname varchar(20
我在 SQL Server 2005 中有包含两列 Fruit 和 Color 的表,如下所示 Fruit Colour Apple Red Orange
我是一名优秀的程序员,十分优秀!