노드 제목과 로고 (cck 필드)를 표시하는 뷰를 만들었습니다. 논쟁에서 나는 분류 용어 이름을 전달했습니다.
결과적으로 노드는 두세 번 표시됩니다. 쿼리 설정에서 고유 확인란을 이미 선택했지만 작동하지 않습니다. 나는 무작위 정렬을 사용했는데, 이는 중복을 일으키는 것으로 보인다. 무작위 정렬을 제거하면 정상적으로 작동합니다.
무작위 정렬을 비활성화하지 않고 어떻게 중복을 피할 수 있습니까?
노드 제목과 로고 (cck 필드)를 표시하는 뷰를 만들었습니다. 논쟁에서 나는 분류 용어 이름을 전달했습니다.
결과적으로 노드는 두세 번 표시됩니다. 쿼리 설정에서 고유 확인란을 이미 선택했지만 작동하지 않습니다. 나는 무작위 정렬을 사용했는데, 이는 중복을 일으키는 것으로 보인다. 무작위 정렬을 제거하면 정상적으로 작동합니다.
무작위 정렬을 비활성화하지 않고 어떻게 중복을 피할 수 있습니까?
답변:
나는이 질문에 이미 답변되었지만, 일부 솔루션의 경우 작동하지 않는다는 것을 알고 있습니다. 그러나 몇 가지 연구를 한 후 내 요구에 맞는 솔루션을 찾았습니다.
나는 이것을 고칠 수있는 정말 유용한 해결책을 찾았다. 코드 스 니펫을 DropBucket에 게시했습니다. 기본적으로 모든 뷰 쿼리에서 groupby 절과 필드를 지정하는 쿼리 주석을 검사하는 Drupal 7 쿼리 변경 후크를 구현합니다. 그런 다음 해당 그룹을 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
소스 참조는 페이지의 주석에 있습니다.
나는 같은 문제가 있었다. 궁극적으로 Views Distinct 모듈 을 설치하여 해결했습니다 .
뷰의 관계 또는 다른 조인은 종종 "중복"결과를 생성합니다. 예를 들어, 여러 값을 가진 필드가있는 노드는 다중 값 필드의 값당 한 번보기에 표시 될 수 있습니다. 실망스럽고 뷰 UI의 "DISTINCT"SQL 쿼리 옵션은 결과 행이 기술적으로 다르기 때문에 실제로 문제를 해결하지 않습니다. 뷰 Distinct 는 이러한 "중복"행을 제거하거나 집계하는 간단한 GUI 방법을 제공하는 것을 목표로합니다.
다중 가치 날짜 필드에 문제가있었습니다. 날짜가 입력 될 때마다 항목이 표시되었습니다. 여기에 언급 된 다른 솔루션 중 어느 것도 나를 위해 일하지 않았습니다. 그러나 나는 여전히 D7에서 작동하는 D6 솔루션을 찾았 습니다 .
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;
}
}
}
편집 : 불행히도 이것은 제한이 설정된 경우보기에서 중복 항목 수를 뺍니다. 누군가가 이것에 대한 해결책을 찾으면 의견을 말하십시오!
이 다른 방법 중 어느 것도 나를 위해 일한 것은 아니지만 Views Random Seed 모듈은 실제로 트릭을 수행했습니다. 그래도 내 문제는 호출기 사용과 관련이 있습니다. 다음은 해당 모듈의 프로젝트 페이지에서 인용 한 것입니다.
시드가 포함 된 임의 순서 처리기를 추가합니다. 상수 정수 인수 N이 sql RAND () 함수에 지정된 경우, 시드 값으로 사용되어 반복 가능한 열 값 시퀀스를 생성합니다. 이렇게하면 페이징이 발생하고 항목이 두 번 표시되지 않을 수 있습니다. PHP를 사용하여 커스텀 시드를 계산할 수있어 날짜와 같은 변수를 기반으로 의사 난수를 생성 할 수 있습니다.