SQL для MYSQL — перекрестное ПРИМЕНЕНИЕ 5 лучших записей

У меня есть требование, в котором мне нужно получить 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, который я пробовал:

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, то у меня возникнет проблема.


person RealSteel    schedule 16.05.2017    source источник
comment
Stack Overflow не является службой перевода кода. Ожидается, что вы попытаетесь написать код самостоятельно, а затем, если у вас возникнут проблемы, вы сможете опубликовать свои попытки с четким объяснением того, что не так. t работает и предоставляет минимальный, полный и проверяемый пример. Я предлагаю прочитать как задать хороший вопрос.   -  person John Conde    schedule 16.05.2017
comment
Вы существуете достаточно долго, и от вас ожидают, что вы попробуете что-нибудь, прежде чем опубликовать здесь.   -  person John Conde    schedule 16.05.2017
comment
Эквивалентом перекрестного применения может быть оконная функция для пользователя, использующая row_number. Нет номера строки в mySQL. Таким образом, эквивалентом mySQL будут две пользовательские переменные; сброс для каждого идентификатора rowNumber. а затем запрос становится тривиальным соединением с номером строки ‹=5.   -  person xQbert    schedule 16.05.2017
comment
Возможный дубликат CROSS/OUTER APPLY в MySQL   -  person stuartd    schedule 16.05.2017
comment
@JohnConde: Спасибо за предложение.   -  person RealSteel    schedule 17.05.2017


Ответы (1)


У вас нет cross apply в MySQL. У вас также нет 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; 
person Gordon Linoff    schedule 16.05.2017
comment
У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с '(выберите df.debtor_id, df.remark как примечания, (@rn := if(@d = df.deb' в строке 3) - person RealSteel; 17.05.2017
comment
Я получаю эту ошибку. Не могли бы вы помочь мне в этом? - person RealSteel; 17.05.2017