#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');
}
}