Group By Issue将MySQL转换为PostgreSQL

时间:2016-06-14 17:34:45

标签: mysql postgresql doctrine symfony-1.4

我正在尝试将旧的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 _...

我在这里停止了,因为这会以一种主要的方式改变查询的行为,我真的不知道发生了什么。

我不怕阅读文档,但我甚至不知道从哪里开始。

如果你知道问题是什么,请告诉我。如果您知道我应该在文档中查找的位置,请告诉我。

提前谢谢。

斯科特

1 个答案:

答案 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');