尝试从表中提取最后一个ID并按特定列分组

时间:2019-07-04 08:06:38

标签: coldfusion coldfusion-10 cfml coldfusion-2016

它只给我一个记录,我不知道出了什么问题,如果我只是循环遍历整个查询,那么它就可以了

<cfquery name="messages_tb" datasource="appdb">
    SELECT * FROM messages
    WHERE receiver = <cfqueryparam value="1" cfsqltype="cf_sql_integer">
    and rt = <cfqueryparam value="1" cfsqltype="cf_sql_tinyint">
    group by sender
</cfquery>

<cfset list.messages_tb_sender = ValueList(messages_tb.sender)>

<cfquery name="messages_tb" datasource="appdb">
    SELECT * FROM messages
    WHERE sender IN ( <cfqueryparam value="#list.messages_tb_sender#" cfsqltype="cf_sql_integer" list="yes">)
    group BY mid
</cfquery>

<cfoutput>
    #messages_tb.mid#
</cfoutput>

这就是表格的外观

mid    sender   receiver  message
======|=======|==========|=============
1        2         1        Hello
2        2         1        Hey
3        3         1        xyz
4        2         1        random text

我只想要3号和4号中段的数据

2 个答案:

答案 0 :(得分:1)

  1. 如果您只需要3号和4号中间数据,则查询将像这样...

    <cfquery name="messages_tb" datasource="appdb">
      SELECT mid, sender, receiver, message FROM messages
      WHERE receiver = <cfqueryparam value="1" cfsqltype="cf_sql_integer">
      and mid in <cfqueryparam value="3,4" list="yes" cfsqltype="cf_sql_integer">
    </cfquery>
    
  2. 如果需要从表中提取最后一个ID并按特定列进行分组。我根据表输出假定mid是唯一的,那么我们可能不需要group by mid

    <cfquery name="messages_tb" datasource="appdb">
      select mid, sender, receiver, message FROM messages
      where mid in (
        select top 1 mid from messages
        and receiver = <cfqueryparam value="1" cfsqltype="cf_sql_integer">
        order by mid desc
        )
    </cfquery>
    

仅供参考:从表格输出中可以看出,没有名为 rt

的列

答案 1 :(得分:1)

(评论太长了...)

  1. 要回答您的问题,显示单个值的原因是因为cfoutput缺少“查询”名称,正如Paul指出的那样。如果没有查询名称,则cfoutput缺省在第一行中显示第一个值。如果要在查询中显示所有行,则必须添加“ query”属性。

    <cfoutput query="messages_tb">
        #messages_tb.mid#
    </cfoutput>
    
  2. 但是,您不需要两个单独的查询。一个简单的JOIN将在单个查询中返回相同的结果。

    SELECT DISTINCT m.Mid
    FROM  messages m INNER JOIN 
          (
            SELECT DISTINCT sender 
            FROM   messages
            WHERE  receiver = <cfqueryparam value="1" cfsqltype="cf_sql_integer">
            AND    rt = <cfqueryparam value="1" cfsqltype="cf_sql_tinyint">
          ) s ON s.sender = m.sender
    
  3. 话虽如此,两个都不会仅返回记录MID = 3和4。所以请您详细说明一下?

    A。 “ MID”列代表什么?
    B。为什么查询应该只返回值3和4?

    根据您的示例数据,第一个查询将返回:

    sender
    ======|
    2
    3
    

    由于所有示例记录均具有这些发送者值,因此您的第二个查询将返回所有4条记录:

    mid    sender 
    ======|=======|
    1        2    
    2        2    
    3        3    
    4        2    
    

    因此您的示例数据有误或当前查询中缺少某些内容。