web-dev-qa-db-ja.com

ビューの結果ページから重複を削除する方法

enter image description here私はWebで見つかったすべてのソリューションを調べました。

DistinctまたはAggregationのどちらも私の場合はまったく機能しません。 hook_query_alter()を使用して重複を削除する方法はありますか?

ビューで実行されるSQLクエリは次のとおりです。

SELECT node.changed AS node_changed, node.nid AS nid, SUM(search_index.score * search_total.count) AS score
FROM 
{node} node
LEFT JOIN {search_index} search_index ON node.nid = search_index.sid
LEFT JOIN {search_total} search_total ON search_index.Word = search_total.Word
INNER JOIN {search_dataset} search_dataset ON search_index.sid = search_dataset.sid AND (search_index.type = search_dataset.type)
WHERE ((( (search_index.type = 'node') AND (search_dataset.data LIKE '% saadan %' ESCAPE '\\') AND (search_dataset.data LIKE '% goer %' ESCAPE '\\') AND (search_dataset.data LIKE '% du %' ESCAPE '\\') ))AND(( (node.status = '1') AND (node.type NOT IN  ('nodetype')) )))
GROUP BY search_index.sid, score, node_changed, nid
HAVING (( (COUNT(*) >= '2') ))
ORDER BY node_changed DESC
LIMIT 10 OFFSET 0 

最後のメモ:

私はまた、hook_views_pre_render()にフックすることによってコンテンツを削除するソリューションを認識していますが、結果を混乱させるため、これをソリューションとは考えていません。

「GROUP BY search_index.sid、score、node_changed、nid」をGROUP BY nidに置き換えると、クエリは完全に機能します。これを行うにはどうすればよいですか?

3
Potney Switters

実際に機能したのは次のとおりです

function mymodule_query_alter($query) {

  if (isset($query->alterMetaData)) {
    if (isset($query->alterMetaData['view'])) {
      if($query->alterMetaData['view']->name == 'node_search') {
        $fields =& $query->getGroupBy();
        // Tried various fields to check which was the field creating the problem.
        unset($fields['score']);
        $query->groupBy('nid');
      }
    }
  }
}

回答は http://www.brenthartmann.com/blog/how-use-hookqueryalter-drupal-7 にあります

PS:ビューを生成するsqlクエリを確認するには、admin/structure/views/settingsに移動して、[Show the SQL query]を有効にする必要があります。

5
Potney Switters

これがあなたを助けることを願って、

Drupal 7では、DistinctまたはAggregationを使用して問題を解決できます。GROUP BYまたは[〜#〜] distinct [〜#〜 ]重複するレコードを削除します。

手順を確認してください。

Distinctの使用

  • ビューで明確な値を達成する簡単な方法は、次のようにすることです。
    • あなたの見解に行く
    • [詳細設定]"[その他]セクションで、[クエリ設定]をクリックします
    • 「個別」チェックボックスをオンにします。

Aggregationの使用

  • ビュー集計設定を有効にして重複レコードを削除することにより、GROUP BYを適用できます。
    • 移動してビューを編集します
    • [詳細]"[その他]セクションで、[集計の使用]を有効にして:はい
    • [FIELDS]または[FILTER CRITERIA]セクションで、グループ化または区別するフィールドの集計設定を選択して適用します。
3
inizio