Запустите этот запрос без изменения sql_mode

Я пытаюсь проверить запрос в тестовой среде, которая выглядит следующим образом

Запрос: -

 SELECT a.aggreatorid AS aggreatorid, '' AS txndesc, DATE_FORMAT(DATE(b.txndate),'%d/%m/%Y') AS txndate,
  SUM(txncredit) AS txncredit, SUM(txndebit) AS txndebit  
  FROM  walletmast a INNER JOIN wallettransaction b ON a.walletid=b.walletid  
  AND txndate  BETWEEN CURDATE() - INTERVAL 3 DAY AND CURDATE()  
  GROUP BY a.aggreatorid, DATE(b.txndate)
  ORDER BY txndate DESC

Запрос выдает следующее

Ошибка: -

SQL Error (1055): 'digitalpurse.b.txnDate' isn't in GROUP BY

Запрос работает в моей локальной среде, но не в тестовой. После многих поисков я обнаружил, что в тестовой среде есть sql_modes, которые нельзя изменить для потока приложений и в целях безопасности.

Режим SQL: -

 @@sql_mode                                                                                                                                |
+------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,
STRICT_TRANS_TABLES,
NO_ZERO_IN_DATE,
NO_ZERO_DATE,
ERROR_FOR_DIVISION_BY_ZERO,
NO_AUTO_CREATE_USER,
NO_ENGINE_SUBSTITUTION |

Есть ли способ выполнить этот запрос без изменения sql_mode? Дайте мне знать, если потребуется какая-либо другая информация. Заранее благодарю

2 ответа

Решение

Переместите запрос в подзапрос, который выбирает DATE(b.txndate)так, чтобы оно соответствовало GROUP BY предложение, а затем выполните форматирование в основном запросе.

SELECT aggreatorid, '' AS txndesc, DATE_FORMAT(txndate, '%d/%m/%Y') AS txndate,
    txncredit, txndebt
FROM (
    SELECT a.aggreatorid AS aggreatorid, DATE(b.txndate) AS txndate,
        SUM(txncredit) AS txncredit, SUM(txndebit) AS txndebit  
    FROM  walletmast a 
    INNER JOIN wallettransaction b ON a.walletid=b.walletid  
    WHERE txndate BETWEEN CURDATE() - INTERVAL 3 DAY AND CURDATE()  
    GROUP BY a.aggreatorid, DATE(b.txndate)
) AS x
ORDER BY txndate DESC
SELECT a.aggreatorid
     , '' txndesc
     , DATE_FORMAT(DATE(b.txndate),'%d/%m/%Y') dt
     , SUM(txncredit) txncredit
     , SUM(txndebit) txndebit  
  FROM  walletmast a 
  JOIN wallettransaction b 
    ON a.walletid=b.walletid  
  AND txndate  BETWEEN CURDATE() - INTERVAL 3 DAY AND CURDATE()  
   GROUP BY a.aggreatorid, dt, txndesc
   ORDER BY txndate DESC

Лично я считаю, что лучше всего, чтобы даты появлялись в локали конечных пользователей, поэтому упражнение для JavaScript или PHP, а не для MySQL

Другие вопросы по тегам