0

我正在尝试在测试环境中测试一个查询,如下所示

询问 : -

 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 的情况下运行这个查询? 如果需要任何其他信息,请告诉我。提前谢谢你:D

4

2 回答 2

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
于 2017-01-23T08:05:17.793 回答
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

于 2017-01-23T08:06:50.753 回答