Comment supprimer les doublons lors de l'utilisation du tri aléatoire?


31

J'ai créé une vue où j'affiche le titre du nœud et un logo (un champ cck). Dans les arguments, j'ai passé le nom du terme de taxonomie.

Dans le résultat, un nœud affiche 2 ou 3 fois; J'ai déjà coché la case distincte dans les paramètres de requête, mais cela ne fonctionne pas non plus. J'ai utilisé le tri aléatoire, qui semble provoquer les doublons; lorsque je supprime le tri aléatoire, cela fonctionne très bien.

Comment puis-je éviter les doublons sans désactiver le tri aléatoire?


ce serait en fait bien si quelqu'un expliquait les raisons des doublons et les contre-mesures. avoir 5 solutions qui fonctionnent «peut-être» n'est que semi-optimal
n3rd

Réponses:


19

Vous pouvez appliquer GROUP BY ou DISTINCT en activant les paramètres d'agrégation des vues pour supprimer les enregistrements en double.
1. Allez modifier votre vue
2. Dans la section Avancé »AUTRE en activant Utiliser l'agrégation: Oui
3. Dans la section CHAMPS ou CRITÈRES DE FILTRE , sélectionnez et appliquez les paramètres d'agrégation pour les champs que vous souhaitez regrouper ou distinguer.


2
J'ai l'exemple de problème, j'active l'utilisation de l'agrégation et dans mon dossier, il n'y a pas de distinctsélection, quel type dois-je sélectionner dans le type d'agrégation?
Yusef

39

La manière simple d'obtenir des valeurs distinctes dans une vue consiste à effectuer les opérations suivantes:

  1. Allez modifier votre vue
  2. Dans la section Advanced »OTHER, cliquez sur" Query setting "
  3. Cochez la case "Distinct".

Dans ma question, j'ai déjà mentionné que j'avais coché l'option Distinct dans les paramètres de requête.
Ahmad

Eugene et Clive, c'est du travail, merci beaucoup de partager cela.

8

La manière simple d'obtenir des valeurs distinctes à l'aide de Views est la suivante:

  1. Allez modifier votre vue
  2. Dans la section Advanced »OTHER, cliquez sur" Query setting "
  3. Cochez la case "Distinct".

Vous pouvez appliquer GROUP BY ou DISTINCT en activant les paramètres d'agrégation des vues pour supprimer les enregistrements en double.

  1. Allez modifier votre vue
  2. Dans la section Avancé »AUTRE en activant Utiliser l'agrégation: Oui
  3. Dans la section FIELDS ou FILTER CRITERIA, sélectionnez et appliquez les paramètres d'agrégation pour les champs que vous souhaitez regrouper ou distinguer.

5

Je sais que cette question a déjà été répondue, mais pour certaines utilisations, ces solutions ne fonctionnent pas. Cependant, après avoir fait quelques recherches, j'ai trouvé une solution qui répond à mes besoins.

J'ai trouvé une solution de contournement vraiment utile qui m'a permis de résoudre ce problème. J'ai publié l'extrait de code sur DropBucket. Fondamentalement, vous implémentez un crochet de modification de requête Drupal 7 qui vérifie toutes les requêtes de vues pour les commentaires de requête qui spécifient une clause et un champ groupby. Il ajoute ensuite ce groupby à la requête 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

La référence source se trouve dans les commentaires sur la page.


Je veux ajouter qu'il existe des problèmes connus avec DISTINCT ne fonctionnant pas correctement dans les vues 3.3 et supérieures.
Patrick

1
Au lieu de faire ce qui précède, vous pouvez simplement vérifier le nom de la vue, puis ajouter le groupe par.
Potney Switters

Cela fonctionne très bien. Aucune des solutions ici n'a fonctionné pour moi, sauf ceci ... le codage est toujours
parfait

4

J'ai eu le même problème. Finalement, je l'ai résolu en installant le module Views Distinct .

Les relations ou autres jointures dans les vues créent souvent des résultats "en double". Par exemple, un nœud avec un champ comportant plusieurs valeurs peut apparaître dans la vue une fois par valeur dans le champ à valeurs multiples. C'est frustrant et l'option de requête SQL "DISTINCT" dans l'interface utilisateur des vues ne résout pas réellement le problème car la ligne de résultat est techniquement distincte. Views Distinct vise à fournir une méthode graphique simple pour supprimer ou agréger ces lignes "en double".


0

A eu des problèmes avec les champs de date à valeurs multiples. Les éléments étaient affichés aussi souvent qu'une date était entrée. Aucune des autres solutions mentionnées ici n'a fonctionné pour moi. Mais j'ai trouvé une solution D6 qui fonctionne encore en D7 il .

hook_views_pre_render(&$view)est le mot magique. Dans l'exemple, il est limité à un certain affichage d'une seule vue. J'espère que ça aide.

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;
    }
  }
}

EDIT: Malheureusement, celui-ci soustrait le nombre d'éléments en double de la vue si une limite a été définie. Si quelqu'un trouve peut-être une solution à cela, veuillez commenter!


0

Ne pas réveiller un vieux fil, mais la réponse (si vous utilisez Drupal 7 et un filtre de recherche exposé) est de cocher "supprimer le score de recherche" sous "recherche: termes de recherche".

Sous "Critères de filtrage"

Ajouter "Recherche: termes de recherche"

Cochez "Supprimer le score de recherche"

Cliquez sur "Appliquer (tous les affichages)"

Cliquez sur Enregistrer


0

Aucune de ces autres méthodes n'a fonctionné pour moi, mais le module Views Random Seed a fait l'affaire. Cependant, mes problèmes étaient plus liés à l'utilisation d'un téléavertisseur. Voici une citation de la page de projet de ce module:

Ajoute un gestionnaire d'ordre aléatoire avec des graines. Si un argument d'entier constant N est spécifié dans la fonction sql RAND (), il est utilisé comme valeur de départ, ce qui produit une séquence répétable de valeurs de colonne. Cela permet d'avoir une pagination et de ne pas afficher les éléments deux fois. Il est également possible de calculer une graine personnalisée en utilisant PHP, ce qui vous permet de créer des nombres pseudo aléatoires basés sur des variables telles que la date du jour.


0

J'ai plusieurs Date fieldset je veux trier par le début de la FIRST date... Voici comment cela a fonctionné: Dans Views->advanced->Other: use aggregation: YES Et puis: SORT CRITERIA->Aggregation settings->Aggregation type: COUNT

Je m'attendais countà me donner le numéro au lieu de l'instance, mais cela a rendu le résultat distinct ...

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.