2017-01-23 3 views
0

Я пытаюсь проверить запрос в тестовой среде, которая является следующимВыполнить этот запрос, не изменяя 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 Mode: -

@@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? Сообщите мне, если какая-либо другая информация будет сохранена. Заранее благодарю вас: D

+0

Возможный дубликат [Есть ли \ _value возможности для MySQL 5.6?] (Http://stackoverflow.com/questions/37089347/is-there-any-value-capability-for-mysql-5-6) – e4c5

+0

@Strawberry сделал это, но данные, возвращаемые по запросу, неверны необходимость размещения этого вопроса – abhi314

+0

Какую версию MySQL вы используете? Если это 5.7, вы можете использовать 'ANY_VALUE()'. – Barmar

ответ

1

Переместите запрос в подзапрос, который выбирает 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 
1
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

Смежные вопросы