Как добавить ОТДЕЛЬНОЕ предложение GROUP BY в представлении drupal

#mysql #sql #drupal #drupal-views #aggregate-functions

#mysql #sql #drupal #drupal-представления #агрегатные функции

Вопрос:

Я использую drupal 6, и я создал представление и запрос представления, который я хочу добавить

ПРЕДЛОЖЕНИЕ GROUP BY И DISTINCT.

Для этого я попытался использовать модуль, внесенный views_groupby, но он предоставляет только функцию агрегации SQL COUNT.

Я не знаю, как добавить предложение group by и предложение distinct в запрос представления с помощью hook_views_query_alter(amp;$view, amp;$query) .

Чтобы это выглядело так —

 SELECT DISTINCT(node.nid) AS nid, OTHER_COLUMN 
FROM TABLE_NAME 
JOIN ANOTHER_TABLE ON JOIN_CONDITION 
GROUP BY nid
 

Любая помощь или предложение будут с благодарностью приняты.

Ответ №1:

Group By не работает с hook_views_query_alter, и это известно как проблема с модулем drupal views. о котором сообщается на https://drupal.org/node/590534 , http://drupal.org/node/1608742 , http://drupal.org/node/389230#comment-2637200

Также функции агрегирования представлений не дают желаемого результата, потому что он добавит все поля и поля порядка сортировки в группу по критериям. Итак, вы должны использовать другие хуки, такие как hook_query_alter.

 function hook_query_alter( amp;$query) {

  if($query->alterMetaData['view']->name == "your_views_name"){
     $query->groupBy("domain_source.domain_id");
     //also you can unset other group by critera by using, unset($query->getGroupBy());
  }
}
 

Комментарии:

1. @B Ravanbakhsh, этот хук доступен только в версии drupal 7 и выше.

Ответ №2:

В вашей форме редактирования представления в разделе «Основные настройки» попробуйте включить параметр Distinct.

Вы также можете попробовать использовать значок шестеренки для раздела «Стиль» в разделе «Основные настройки«. Там вы можете указать поле для группировки, если ваш стиль строки — поля.

Комментарии:

1. используя раздел style в разделе «Основные настройки», разделяйте только строки таблицы, которые разделяют каждую строку на поле, которое вы вводите в раскрывающемся списке группирующих полей. Но это не изменяет запрос, как я упоминал в своем вопросе. Кстати, мне нужно проверить параметр DISTINCT, как вы предложили. Пока все выглядит хорошо. Я собираюсь это проверить. Спасибо.

2. По умолчанию он применяет предложение group by к nid. Знаете ли вы, как применить предложение group by, отличное от nid.

3. Единственный известный мне способ применить предложение Group By к чему-то, кроме NID, — это использовать «основные настройки -> стиль -> настройки: группировать по полю»

4. Спасибо за ваш ответ. То, что вы предлагаете, не будет работать в моем требовании. Как я уже упоминал в своем самом первом комментарии. Но ваш ответ мне очень помог. Поэтому я принимаю это с большой улыбкой.

5. Спасибо. Кроме того, вам следует проверить hook_views_query_alter ( views.doc.logrus.com ). При этом вы должны иметь возможность перехватывать пользовательский модуль и переписывать запрос по своему вкусу.

Ответ №3:

В Drupal 8 вы добавите «Group by» таким образом:

 use DrupalCoreDatabaseQueryAlterableInterface;

function MYMODULE_query_alter(AlterableInterface $query) {
  if (isset($query->alterMetaData['view'])) {
    if($query->alterMetaData['view']->id() == 'replace_by_view_machine_name') {
      // Group by UID to remove duplicates from View results
      $query->groupBy('users_field_data.uid');
    }
  }
}
 

Ответ №4:

 function hook_views_query_alter(amp;$view, amp;$query) {
  if ($view->name == 'your_view_name') {
    $query->add_field('table', 'field', 'alias', array('function', groupby));
    $query->add_groupby('table.field');
  }
}