一个限制select语句返回的行的计数器

时间:2011-03-15 01:47:49

标签: mysql sql

我有一个相当复杂的select语句。但是,我有一个列,让我们说日期,以及一个名为title的列,然后我想要一个计数器(如果日期不等于前一个日期则递增),计算结果集中的每一天,当计数器达到10时我想要SQL语句返回10个第一个日期的结果集。

日期只是我问题的一个类比;重要的是我的柜台。

编辑:

这是我真正的问题:

我希望得到10个第一次对话以及他们最新的消息和时间。我希望sql也能在对话中检索被邀请者(我这样做是通过添加具有相同conversationId latestMessage的行和时间以及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 ";

更新 我在查询中删除了组语句。我上面有一个问题,那就是列中的值都不是彼此不同的。正如我所说:

  

希望得到10个第一次谈话   以及他们的最新消息和   时间。我希望sql检索   也在谈话中受到邀请(我知道   这通过添加相同的行   conversationId latestMessage和时间   以及不同的价值观   简档。我将邀请分组给每个人   稍后在JAVA代码中进行对话)

但是profileId也没有区别(我的意思是每个对话都不同,但可以邀请用户进行多次对话)。问题是如何以简单的方式添加始终具有不同值的列?所以我可以把柜台分组?

5 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

如果没有更加可靠的信息,很难给出一个非常好的答案,但是你可以选择前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

答案 2 :(得分:0)

在Oracle中,您可以获得LEAD和LAG窗口函数,以允许此类行到行值分析。

答案 3 :(得分:0)

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

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

答案 4 :(得分:-1)

SELECT title, COUNT(DISTINCT date) AS nb
FROM myTable
GROUP BY title
HAVING nb > 10
LIMIT 10