Запустите этот запрос без изменения 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