2017-05-16 11 views
0

User ID을 포함하여 users latest 5 remarks 데이터를 가져와야하는 요구 사항이 있습니다.
그래서 cross apply을 사용하고 RemarksData as alias 이름을 사용했습니다.SQL에서 MySQL로 - 상위 5 개 레코드 적용

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로 변환 할 수 있다면 누구든지 저를 제안 할 수 있습니까?

일부 온라인 변환기도 시도했지만 나에게 도움이되지 않았습니다.

필요한 경우 추가 정보를 제공 할 수 있습니다.

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; 

그러나 여기에 모든 채무자 (사용자) 만 한 기록을 반환 : 나는 시도했다

MySQL의 쿼리이다. 하지만 최신 5 개의 레코드가 필요합니다. LIMIT 5을 입력하면 문제가 발생합니다.

+0

스택 오버플로가입니다 ** 쓰기 코드를 직접 작성한 다음 ** 문제가있는 경우 ** 시도한 것을 ** 게시 할 수 있습니다 ** 작동하지 않는 것에 대한 명확한 설명 **을 제공하고 [최소, 완료 및 확인 가능한 예제] (http://stackoverflow.com/help/mcve). [좋은 질문을하는 법을] ​​읽는 것이 좋습니다. (http://stackoverflow.com/help/how-to-ask) –

+0

여기에 게시하기 전에 뭔가를 시도 할 것으로 예상됩니다. –

+1

등가물 적용은 row_number를 사용하는 사용자의 윈도우 함수 일 것입니다 .SQL에 행 번호가 없습니다. 두 개의 사용자 변수; 각 ID에서 rowNumber를 재설정합니다. 쿼리는 행 번호가 <= 5 인 사소한 조인이됩니다. – xQbert

답변

2

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; 
+0

SQL 구문에 오류가 있습니다. 가장 가까운 구문을 찾으려면 MySQL 서버 버전에 해당하는 설명서를 확인하십시오. '(df.debtor_id, df.remark를 비고로 선택, (@rn : = if (@d = df.deb'3 행에 있음) – RealSteel

+0

이 오류가 발생했습니다. 제발 도와 주실 수 있나요? – RealSteel