Как удалить дубликаты при использовании случайной сортировки?


31

Я создал вид, в котором я отображаю название узла и логотип (поле cck). В аргументах я передал название таксономического термина.

В результате узел отображается 2 или 3 раза; Я уже установил четкий флажок в настройках запроса, но это также не работает. Я использовал случайную сортировку, которая, кажется, вызывает дубликаты; когда я удаляю случайную сортировку, она работает нормально.

Как я могу избежать дубликатов, не отключая случайную сортировку?


было бы неплохо, если бы кто-то объяснил причину (ы) дубликатов и контрмер. 5 решений, которые «возможно» работают, являются лишь
полуоптимальными

Ответы:


19

Вы можете применить GROUP BY или DISTINCT, включив параметры агрегирования представлений для удаления дублирующихся записей.
1. Перейдите и отредактируйте свой вид
2. В разделе « Дополнительно» »ДРУГОЙ , включив параметр Использовать агрегирование: Да
3. В разделе ПОЛЯ или КРИТЕРИИ ФИЛЬТРА выберите и примените параметры агрегации, для которых вы хотите сгруппировать или различить поля.


2
У меня проблема с примером, я включил использование агрегации, и в моем поле не distinctвыбрано, какой тип выбрать в типе агрегации?
Юсеф

39

Простой способ получения различных значений в представлении состоит в следующем:

  1. Перейти и отредактировать свой вид
  2. В разделе «Дополнительно» ДРУГОЙ нажмите «Настройка запроса»
  3. Поставьте галочку напротив «Отличить».

В своем вопросе я уже упомянул, что я проверил опцию «Отличить» в настройках запроса.
Ахмад

Евгений и Клайв, это работа, большое спасибо за то, что поделились этим.

8

Простой способ получить разные значения с помощью Views - это сделать следующее:

  1. Перейти и отредактировать свой вид
  2. В разделе «Дополнительно» ДРУГОЙ нажмите «Настройка запроса»
  3. Поставьте галочку напротив «Отличить».

Вы можете применить GROUP BY или DISTINCT, включив параметры агрегирования представлений для удаления дублирующихся записей.

  1. Перейти и отредактировать свой вид
  2. В разделе «Дополнительно» ДРУГОЙ, включив Использовать агрегирование: Да
  3. В разделе ПОЛЯ или КРИТЕРИИ ФИЛЬТРА выберите и примените параметры агрегации, для которых вы хотите сгруппировать или выделить поля.

5

Я знаю, что на этот вопрос уже был дан ответ, но в некоторых случаях эти решения не работают. Однако после некоторых исследований я нашел решение, которое работает для моих нужд.

Я нашел действительно полезный обходной путь, который позволил мне это исправить. Я разместил фрагмент кода в DropBucket. По сути, вы реализуете крючок изменения запроса в Drupal 7, который проверяет все запросы представлений на наличие комментариев к комментариям, которые определяют предложение и поле groupby. Затем он добавляет эту группу в запрос SQL.

/**
 *  Found this trick on theoleschool.com.
 *  
 *  Description: Allows the view developer to specify the query
 *  group by action in the query comments. Great way to force the
 *  removal of duplicates.
 *  
 *  Just go into your query comments and type in "groupby:" with
 *  that colon followed by the field you want to group by.
 * 
 *  Examples...
 *  groupby:node.nid
 *  groupby:file_managed_file_usage.fid
 * 
 *  Ref-Comment: http://theoleschool.com/comment/496#comment-496
 *  Ref-Article: http://theoleschool.com/blog/using-hookviewsalter-add-group-statement
 */
function mymodule_query_alter(QueryAlterableInterface $query) {
  if ($query->hasTag('views')) {
    static $count;
    $view =& $query->getMetaData('view');

    if (strstr($groupby = $view->query->options['query_comment'], 'groupby')) {
      list($action, $field) = explode(':', $groupby);

      if (strlen($field) > 0) {
        $query->groupBy($field);
      }
    }
  }
}

http://dropbucket.org/node/153

Ссылка на источник находится в комментариях на странице.


Я хочу добавить, что есть известные проблемы с DISTINCT, не функционирующим должным образом в представлениях 3.3 и выше.
Патрик

1
Вместо того, чтобы делать вышеупомянутое, вы можете просто проверить имя представления и затем добавить группу по.
Потни Свиттерс

Это прекрасно работает. Ни одно из решений здесь не сработало для меня, кроме этого ... кодирование всегда
потрясает,

4

У меня такая же проблема. В конце концов я решил это, установив модуль Views Distinct .

Отношения или другие объединения в представлениях часто создают «дублирующие» результаты. Например, узел с полем, имеющим несколько значений, может отображаться в представлении один раз для каждого значения в поле с несколькими значениями. Это разочаровывает, и опция SQL-запроса "DISTINCT" в пользовательском интерфейсе Views фактически не решает проблему, поскольку строка результатов технически отличается. Views Distinct стремится предоставить простой метод графического интерфейса для удаления или объединения этих «дублирующих» строк.


0

Были проблемы с полями с несколькими значениями даты. Элементы были показаны так часто, как дата была введена. Ни одно из упомянутых здесь решений не помогло мне. Но потом я нашел решение D6 , который все еще работает в D7 там .

hook_views_pre_render(&$view)это волшебное слово. В этом примере он ограничен одним определенным отображением только одного определенного представления. Надеюсь, это поможет.

function MYMODULE_views_pre_render(&$view) {
  $used_nids = array();

  if ($view->name == 'events') {

    if ($view->current_display == 'page_2') {

      foreach ($view->result as $row) {

        if (!in_array($row->nid, $used_nids)) {

          $new_view_result[] = $row;
          $used_nids[] = $row->nid;
        }
      }
      $view->result = $new_view_result;
    }
  }
}

РЕДАКТИРОВАТЬ: К сожалению, этот вычитает количество повторяющихся элементов из представления, если был установлен предел. Если кто-то может найти решение для этого, пожалуйста, прокомментируйте!


0

Не для того, чтобы разбудить старую ветку, но ответ (если используется Drupal 7 и открытый поисковый фильтр) - проверить «удалить оценку поиска» в разделе «поиск: условия поиска».

В разделе «Критерии фильтра»

Добавить "Поиск: условия поиска"

Проверьте "Удалить результаты поиска"

Нажмите «Применить (все показы)»

Нажмите Сохранить


0

Ни один из этих других методов не работал для меня, но модуль Views Random Seed действительно справился с задачей. Хотя мои проблемы были связаны с пейджером. Вот цитата со страницы проекта этого модуля:

Добавляет обработчик случайного порядка с помощью seed. Если в функции sql RAND () указан постоянный целочисленный аргумент N, он используется в качестве начального значения, которое создает повторяющуюся последовательность значений столбца. Это позволяет иметь подкачку и не показывать элементы дважды. Также возможно вычислить пользовательское начальное число с помощью PHP, что позволяет создавать псевдослучайные числа на основе таких переменных, как дата дня.


0

У меня есть несколько Date fieldsи хочу отсортировать по началу FIRST date... Вот как это работает: В Views->advanced->Other: use aggregation: YES И тогда: SORT CRITERIA->Aggregation settings->Aggregation type: COUNT

Я ожидал countдать мне номер вместо экземпляра, но это сделало результат отчетливым ...

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.