私は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に置き換えると、クエリは完全に機能します。これを行うにはどうすればよいですか?
実際に機能したのは次のとおりです
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]を有効にする必要があります。
これがあなたを助けることを願って、
Drupal 7では、DistinctまたはAggregationを使用して問題を解決できます。GROUP BYまたは[〜#〜] distinct [〜#〜 ]重複するレコードを削除します。
手順を確認してください。
Distinctの使用
Aggregationの使用