2014-02-24 87 views
0

我有以下查询可以在我的测试框上正常运行,但不适用于我的生产框。问题是什么?mysql查询在不同的服务器上给出不同的结果

SELECT 
    *, 
    round(priceperkm * IFNULL(KMPlanned, projects.KM), 
      4) AS NEWVALUE, 
    round(PRICE * IFNULL(KMPlanned, projects.KM), 
      2) AS TotalPriceForItem, 
    SUM(((abs(FSP - LSP) + 1) * SI)/1000) AS KM_Completed, 
    round(SUM(((abs(FSP - LSP) + 1) * SI)/1000) * PRICE, 
      2) AS TotalPrice, 
    round((SUM(((abs(FSP - LSP) + 1) * SI)/1000) * PRICE)/(PRICE * IFNULL(KMPlanned, projects.KM)) * 100, 
      2) AS TotalPercent 
FROM 
    hdb.projects 
     join 
    biditems ON projects.id = biditems.project_id 
     join 
    lookupprocess ON biditems.ITEMID = lookupprocess.biditems_id 
     left join 
    jobsprocesscomplete ON lookupprocess.ID = lookupprocess_id 
     left join 
    detailsseismic ON jobsprocesscomplete.JOBNO = detailsseismic.JOBNO 
where 
    projects.PROJID = 1402013 
     and lookupprocess.ID = 13138  

错误:

2014/02/24 18:37:06 [error] [system.db.CDbCommand] CDbCommand::() failed: SQLSTATE[42000]: Syntax error or access violation: 1140 Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause. The SQL statement executed was: 


       . 
2014/02/24 18:37:06 [error] [exception.CDbException] exception 'CDbException' with message 'CDbCommand failed to execute the SQL statement: SQLSTATE[42000]: Syntax error or access violation: 1140 Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause' in /data/intranet/html/yii-1.1.14/framework/db/CDbCommand.php:543 
Stack trace: 
#0 /data/intranet/html/yii-1.1.14/framework/db/CDbCommand.php(377): CDbCommand->queryInternal('', 0, Array) 
#1 /data/intranet/html/paradox/protected/controllers/GlobalController.php(260): CDbCommand->query() 
#2 /data/intranet/html/paradox/protected/controllers/ProjectsController.php(648): GlobalController->lookupprocesstotal('1402013', Array) 
#3 [internal function]: ProjectsController->actionUpdate('12768') 
#4 /data/intranet/html/yii-1.1.14/framework/web/actions/CAction.php(108): ReflectionMethod->invokeArgs(Object(ProjectsController), Array) 
#5 /data/intranet/html/yii-1.1.14/framework/web/actions/CInlineAction.php(47): CAction->runWithParamsInternal(Object(ProjectsController), Object(ReflectionMethod), Array) 
#6 /data/intranet/html/yii-1.1.14/framework/web/CController.php(308): CInlineAction->runWithParams(Array) 
#7 /data/intranet/html/yii-1.1.14/framework/web/CController.php(286): CController->runAction(Object(CInlineAction)) 
#8 /data/intranet/html/yii-1.1.14/framework/web/CController.php(265): CController->runActionWithFilters(Object(CInlineAction), Array) 
#9 /data/intranet/html/yii-1.1.14/framework/web/CWebApplication.php(282): CController->run('update') 
#10 /data/intranet/html/yii-1.1.14/framework/web/CWebApplication.php(141): CWebApplication->runController('projects/update') 
#11 /data/intranet/html/yii-1.1.14/framework/base/CApplication.php(180): CWebApplication->processRequest() 
#12 /data/intranet/html/paradox/index.php(31): CApplication->run() 
#13 {main} 
REQUEST_URI=/sidb/index.php?r=projects/update&id=12768 
HTTP_REFERER=http://intranet/sidb/index.php?r=projects/admin 

UPDATE 两个服务器都在下面提供 SELECT @@ GLOBAL.sql_mode相同的结果; + ------------------- + | @@ GLOBAL.sql_mode | + ------------------- + | | + ------------------- + 1行中集(0.00秒)

mysql> SELECT @@SESSION.sql_mode; 
+--------------------+ 
| @@SESSION.sql_mode | 
+--------------------+ 
|     | 
+--------------------+ 
1 row in set (0.00 sec) 

mysql> show variables like 'sql_mode' 
    -> ; 
+---------------+-------+ 
| Variable_name | Value | 
+---------------+-------+ 
| sql_mode  |  | 
+---------------+-------+ 

,如果我在查询的末尾添加group by lookupprocess.ID会发生什么。它会返回相同的结果吗?

+2

您的poduction服务器可能已打开ONLY_FULL_GROUP_BY选项,而测试服务器尚未打开,请参阅此链接了解详细信息:http://dev.mysql.com/doc/refman/5.1/en/server-sql- mode.html#sqlmode_only_full_group_by – krokodilko

回答

0

我将两台服务器都更新到了存储库中最新的mysql版本。受影响的服务器有旧版本,我认为它不支持sql语句。

1

您的select子句同时具有列和聚合函数(sum())。这会将查询转换为只返回一行的聚合查询,这可能是也可能不是您想要的。 (我怀疑你实际上是想group by东西。)

在任何情况下,这使用MySQL扩展。该扩展由系统变量ONLY_FULL_GROUP_BY控制。如果启用此选项,则ANSI规则适用。阅读它here

您看到的行为表明ONLY_FULL_GROUP_BY在生产服务器上启用,但在开发服务器上未启用。您应该启用它或在​​两者中禁用它。

相关问题