【发布时间】:2011-03-15 10:50:25
【问题描述】:
我有一个相当复杂的 select 语句。但是,我有一个列,比如说日期和一个名为标题的列,然后我想要一个计数器(如果日期不等于前一个日期,它会递增),当计数器达到 10 时,我想要 SQL 语句返回前 10 个日期的结果集。
日期只是我的问题的一个类比;重要的部分是我的柜台。
编辑:
这是我真正的问题:
我想获取第 10 个对话以及他们的最新消息和时间。我也希望 sql 检索对话中的受邀者(我通过添加具有相同的 conversationId latestMessage 和 time 的行以及不同的 profileId 值来做到这一点。我稍后在 JAVA 代码中将受邀者分组到每个对话中)。我有一个名为 conversation_invited 的表和另一个名为会话消息的表。在表conversation_messages 中,我有conversationId、profileId、messageBody、timeStamp 等列。在表conversation_invited 中,只有conversationId 和profileId 列。
SELECT M1.conversationId, M1.profileId, profiles.profileMiniature, profiles.firstName, profiles.lastName, M2.lastMessageTime, count(DISTINCT M2.lastMessageTime) AS nb, M3.messageBody AS lastMessage " +
"FROM conversation_invited AS M1 " +
"INNER JOIN ( " +
" SELECT conversationId, " +
" max(timeStamp) AS lastMessageTime" +
" FROM conversation_messages " +
" WHERE conversationId in ( " +
" SELECT conversationId" +
" FROM conversation_invited " +
" WHERE profileId = ? " +
" ) " +
" GROUP BY conversationId " +
" ) AS M2 " +
"ON M1.conversationId = M2.conversationId " +
"LEFT JOIN conversation_messages AS M3 " +
"ON M2.lastMessageTime = M3.timeStamp " +
"INNER JOIN profiles " +
"ON profiles.profileId = M1.profileId " +
"WHERE M1.profileId <> ? " +
// WHICH COLUMN SHALL I GROUP WITH?
"HAVING nb < 10 " +
"ORDER BY M2.lastMessageTime DESC ";
更新: 我已删除查询中的 group 语句。我在上面有一个问题,那就是列中的值都不是彼此不同的。正如我所说:
想要获得第 10 个对话 连同他们的最新消息和 时间。我希望 sql 检索 也被邀请参加对话(我愿意 这通过添加相同的行 对话 ID 最新消息和时间 以及不同的价值观 个人资料 ID。我将受邀者分组到每个 以后用JAVA代码对话)
但是 profileId 也不是不同的(我的意思是在每个对话中都不同,但是可以邀请用户进行多次对话)。问题是如何以简单的方式添加始终具有不同值的列?以便我可以对计数器进行分组?
【问题讨论】:
-
什么数据库?有区别,你知道的。例如,在 MySQL 中使用 LIMIT,在 SQL Server 中使用 TOP。
-
woho - 您能否列出一些示例行和预期结果?