2016-06-14 3 views
0

Я пытаюсь преобразовать старое приложение Symfony 1.4 из MySQL в PostgreSQL.Группа по проблеме преобразования MySQL в PostgreSQL

Я снова и снова сталкиваюсь с тем же вопросом.

У меня есть длинное соединение, и он всегда жалуется, что у меня есть группа ... и в некоторых случаях я добавляю группу 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 : SELECT i.id AS i__id, i.featured AS i__featured, i.status AS ...

Так что я изменить код, чтобы ...

->andWhere('a.quantity > ?', 0) 
     ->groupBy('a.id'); 

Тогда я получаю новую ошибку ...

SQLSTATE [42803]: Группировка ошибка: 7 ERROR: столбец "s.id" должен появиться в GROUP BY оговорки или использоваться в агрегатной функции Строка 1: ... AS i__created_at, i.updated_at А.С. i__updated_at , s.id AS s_...

Я остановился здесь, потому что это существенно меняет поведение запроса, и я действительно не знаю, что происходит.

Я не боюсь читать документы, но я даже не знаю с чего начать.

Если вы знаете, в чем проблема, пожалуйста, дайте мне знать. Если вы знаете, где я должен искать документы, сообщите мне об этом.

Благодарим вас заблаговременно.

Скотт

+0

MySQL является исключением, весь другие основными СУБД требует запросов с использованием агрегатных функций (например, AVG) группы всех необобщенными полей, включенными в результатах. Отсутствие группы полностью заставляет меня думать, что объединенные таблицы были в соотношении 1: 1 с «Элементами», или результаты для неагрегированных полей были практически случайными. – Uueerdo

ответ

0

Это не является правильным для PostgreSQL без GROUP BY все столбцы, кроме ur.rating:

->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'); 
+0

Спасибо. Это избавляет от ошибки, но данные из остальных левых соединений теперь отсутствуют. Остались ли в Postgres не одинаковые слова? – smugford

+0

Мне просто нужно прочитать о соединениях. они выглядят совсем немного – smugford

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