【发布时间】: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