首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL到MYSQL -交叉应用前5条记录

SQL到MYSQL -交叉应用前5条记录
EN

Stack Overflow用户
提问于 2017-05-16 14:17:15
回答 1查看 1.3K关注 0票数 0

我需要在其中获取users latest 5 remarks数据,包括他的User ID

因此,我使用了cross applyRemarksData as alias名称。

SQL查询:

代码语言:javascript
复制
select DD.DEBTOR_ID,RemarksData.*
from DMS_DEBTOR DD 
cross APPLY 
(
SELECT TOP 5 DF.REMARK as [Remarks]
FROM  DMS_FOLLOWUP DF
WHERE  DF.DEBTOR_ID = DD.DEBTOR_ID
ORDER  BY DF.FOLLOWUP_TIME desc
) RemarksData where DD.BATCHNO in ('MBB EX-24') and DD.flagabort='0' order by DD.NAME  

我的查询示例数据:

代码语言:javascript
复制
ID    NAME      Remarks
-----------------------------------------
2881173   ARIFFIN   Sent To FV
2881173   ARIFFIN   CHECKING PAYMENT
2881173   ARIFFIN   FULLSETTLEMENT
2881173   ARIFFIN   CALLED BV
2881173   ARIFFIN   BROKEN PROMISE
-----------------------------------------
1682126   ASRI      Waiting For Results
1682126   ASRI      CHECKING PAYMENT
1682126   ASRI      PROPOSAL
1682126   ASRI      CALLED
1682126   ASRI      BROKEN PROMISE
-------------------------------------------
1703446   ASRUL     Sent To FV
1703446   ASRUL     CHECKING PAYMENT
1703446   ASRUL     PROPOSAL
1703446   ASRUL     RNR
1703446   ASRUL     BROKEN PROMISE

为了理解清楚,我将每个用户记录分开。

在这里,您可以看到,该查询为每个用户提供了他的最后5条注释。

现在,我计划将相同的查询转换为MySQL,但无法找到交叉应用的替代方案。

如果这个SQL查询可以以任何其他方式完成,或者至少可以将其转换为MySQL,任何人可以建议我吗?

我也尝试过一些在线转换器,但对我来说没有什么用。

如果需要,我可以提供更多的信息。

我尝试过的MySQL Query是:

代码语言:javascript
复制
SELECT
   DD.DEBTOR_ID,DD.CARDNO,DD.ACCOUNTNO,DD.NAME,
  ,(SELECT DF.REMARK as Remarks
      FROM DMS_FOLLOWUP DF
     WHERE DF.DEBTOR_ID = DD.DEBTOR_ID
  ORDER BY DF.FOLLOWUP_TIME DESC
     LIMIT 1
   )   AS VALUE
FROM
  DMS_DEBTOR DD limit 10;  

但是它只为这里的每个债务人(用户)返回了一条记录。但我需要最新的5张唱片。如果我把LIMIT 5放上去,那我就有问题了。

EN

回答 1

Stack Overflow用户

发布于 2017-05-16 14:24:02

您没有cross apply in MySQL。您也没有row_number() (这也是一种自然的表达方式。相反,您可以使用变量:

代码语言:javascript
复制
select DD.DEBTOR_ID,RemarksData.*
from DMS_DEBTOR DD join
     (select df.debtor_id, df.remark as Remarks,
             (@rn := if(@d = df.debtor_id, @rn + 1,
                        if(@d := df.debtor_id, 1, 1)
                       )
             ) as rn
      from DMS_FOLLOWUP DF cross join
           (select @rn := 0, @d := -1) params
      order by df.debtor_id, df.followup_time desc
     ) df
     on  DF.DEBTOR_ID = DD.DEBTOR_ID
where DD.BATCHNO in ('MBB EX-24') and DD.flagabort = '0' and
      rn <= 5
order by DD.NAME, rn; 
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44004023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档