Group by mssql

Опубликовано 2011.09.20

В БД MSSQL оператор group by работает как то странно... У меня был запрос к MySql написанный для Drupal 7
  1. $query = db_select('cb_services_poll_child','p');
  2. $query ->leftJoin('cb_services_poll', 'pm', 'pm.id = '.$id_widget);
  3. $query ->fields('p', array('vote'));
  4. $query ->fields('pm', array('options'));
  5. $query ->addExpression('COUNT(*)','n');
  6. $query ->condition('p.srv_id', $id_widget);
  7. $query ->groupBy('p.vote');
  8. $result=$query->execute();
В мускуле всё срабатывало на ура,а MsSql выдавал is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY Оказывается группуровать в MsSql`е нужно сразу по всем полям, а не по одному.И поля(после group by) должны быть разделены пробелом и запятой. Незнаю откуда у Microsoft руки растут.. В итоге:
  1. ...
  2. вместо
  3. $query ->groupBy('p.vote');
  4.  
  5. ...
  6. написал
  7. $query ->groupBy('p.vote, pm.options');
Далее если вы используете функции пагинации:
  1. $query ->extend('PagerDefault');
То можете получить следующую ошибку PagerDefault->execute() (line 79 Решается она следующим образом. Сгруппированный GroupBy раскидываем на 2.Вот так:
  1. ...
  2. вместо
  3. $query ->groupBy('p.vote, pm.options');
  4.  
  5. ...
  6. пишем
  7. $query ->groupBy('p.vote');
  8. $query ->groupBy('pm.options');