【问题标题】:SQL to MYSQL - cross APPLY top 5 RecordsSQL 到 MYSQL - 交叉应用前 5 条记录
【发布时间】:2017-10-15 16:28:45
【问题描述】:

我有一个要求,我需要获取 users latest 5 remarks 数据,包括他的 User ID
所以,我使用了cross apply 并使用了RemarksData as alias 名称。

SQL 查询:

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  

我的查询示例数据:

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 我试过的是:

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;  

但它在这里只为每个债务人(用户)返回 1 条记录。但我需要最新的 5 条记录。如果我输入LIMIT 5,那么我遇到了问题。

【问题讨论】:

  • Stack Overflow 不是代码翻译服务。您应该尝试自己编写代码,然后如果遇到问题,您可以发布您尝试过的内容,并清楚地解释什么是' t 工作 并提供Minimal, Complete, and Verifiable example。我建议阅读how to ask a good question
  • 您已经存在了足够长的时间,以至于您应该在此处发布之前尝试一些东西。
  • Cross apply 等价于用户使用 row_number 的窗口函数。 mySQL 中没有行号。所以 mySQL 等价物将是两个用户变量;在每个 ID 上重置 rowNumber。然后查询变成一个普通连接,行号
  • @JohnConde :感谢您的建议。

标签: mysql sql-server inner-join cross-apply


【解决方案1】:

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

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; 

【讨论】:

  • 您的 SQL 语法有误;检查与您的 MySQL 服务器版本相对应的手册,以了解在 '(select df.debtor_id, df.remark as Remarks, (@rn := if(@d = df.deb' at line 3) 附近使用的正确语法>
  • 我收到了这个错误。你能帮我解决这个问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多