我正在尝试将旧的symfony 1.4应用程序从MySQL转换为PostgreSQL。
我一遍又一遍地遇到同样的问题。
我有一些长连接,它总是抱怨必须有一个Group By ...并且在某些情况下我添加Group By并且它要求另一个。
我是postgres的新手,我完全不知道发生了什么。
以下是学说查询和错误消息。
public function getClassifieds($gs_id, $sort_param, $sorter) {
$q = Doctrine_Query::create()
->select('a.*, u.*, t.*,ug.*,ur.*, avg(ur.rating) as rating ')
->from('Items a')
->leftJoin('a.MonitoredAds ma ON ma.item_id = a.id')
->leftJoin('a.GameCategories gc ON gc.game_id = a.game_id')
->leftJoin('a.User u ON u.id = a.user_id')
->leftJoin('u.Profile ug ON ug.user_id = u.id')
->leftJoin('a.UserRatings ur ON ug.user_id = ur.seller_id')
->where('a.game_server_id = ?', $gs_id)
->andWhere('a.quantity > ?', 0);
switch ($sorter) {
case 'datetime_oldest_to_newist':
$q->orderBy('a.created_at asc');
break;
case 'datetime_newest_to_oldest':
$q->orderBy('a.created_at desc');
break;
case 'price_lowest_to_highest':
$q->orderBy('a.price + 0 ASC');
break;
case 'price_highest_to_lowest':
$q->orderBy('a.price + 0 DESC');
break;
case 'quantity_lowest_to_highest';
$q->orderBy('a.quantity asc');
break;
case 'quantity_highest_to_lowest';
$q->orderBy('a.quantity desc');
break;
case 'quantity_highest_to_lowest';
$q->orderBy('a.quantity desc');
break;
case 'sortby_usernameasc':
$q->orderBy('u.username asc');
break;
case 'sortby_usernamedesc':
$q->orderBy('u.username desc');
break;
case 'sortby_userstatus':
$q->orderBy('ug.user_status asc');
break;
}
return $q;
}
给我这个错误信息
SQLSTATE [42803]:分组错误:7错误:列" i.id"必须出现在GROUP BY子句中或用于聚合函数 第1行:选择i.id AS i__id,i.featured AS i__featured,i.status AS ...
所以我将代码更改为......
->andWhere('a.quantity > ?', 0)
->groupBy('a.id');
然后我收到一个新错误......
SQLSTATE [42803]:分组错误:7错误:列" s.id"必须出现在GROUP BY子句中或用于聚合函数 第1行:... AS i__created_at,i.updated_at AS i__updated_at,s.id AS s _...
我在这里停止了,因为这会以一种主要的方式改变查询的行为,我真的不知道发生了什么。
我不怕阅读文档,但我甚至不知道从哪里开始。
如果你知道问题是什么,请告诉我。如果您知道我应该在文档中查找的位置,请告诉我。
提前谢谢。
斯科特
答案 0 :(得分:0)
除了GROUP BY
之外,没有ur.rating
所有列的PostgreSQL不正确:
->select('a.*, u.*, t.*,ug.*,ur.*, avg(ur.rating) as rating ')
每个选定且有序的列必须位于GROUP BY
或agregate函数中。
例如,重写查询:
->select('u.id, avg(ur.rating) as rating ')
...
->orderBy('u.id');
->groupBy('u.id');