【问题标题】:A counter that limits the rows returned by a select statement限制 select 语句返回的行的计数器
【发布时间】: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 - 您能否列出一些示例行和预期结果?

标签: mysql sql


【解决方案1】:

查看GROUP BYDISTINCT 表达式(与LIMIT 结合使用)。您应该能够使用这些来找到您喜欢的日期;然后,您可能需要将它们用作子查询来检索您喜欢的行(也许其他人会想出如何一次性完成所有操作,或者您可能会!)。

【讨论】:

    【解决方案2】:

    如果没有更可靠的信息,很难给出一个很好的答案,但是您能否选择前 10 个唯一日期,然后将这些日期内部连接到主查询中以返回您想要的结果?

    我在想这样的事情:

    with top_10_unique_dates as (
    select top 10 distinct date from
    table_whatever
    where blah = blah
    order by something
    )
    
    select * from
    table_whatever
    where blah = blah
    inner join top_10_unique_dates
    on table_whatever.date = top_10_unique_dates.date
    

    【讨论】:

      【解决方案3】:

      在 Oracle 中,您可以使用 LEAD 和 LAG 窗口函数来进行这种类型的行到行值分析。

      【讨论】:

        【解决方案4】:

        您想要前 10 个日期的所有标题?

        select title, date
        from yourtable
        where date in (
            select distinct date
            from yourtable
            order by date asc
            limit 10
        )
        

        【讨论】:

          【解决方案5】:
          SELECT title, COUNT(DISTINCT date) AS nb
          FROM myTable
          GROUP BY title
          HAVING nb > 10
          LIMIT 10
          

          【讨论】:

          • 计数(DISTINCT 日期)是多少?
          • COUNT(DISTINCT date) = 如果日期不等于前一个日期则递增
          • 我还有一个问题,标题在某些情况下是相同的,否则我认为它会起作用。但是如何解决呢?
          • 为什么改成limit 10?那会限制我的结果吗?
          • 醒来 ggregorie 我快完成了!
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-02
          • 2018-12-17
          相关资源
          最近更新 更多