web-dev-qa-db-fra.com

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

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?

30
Ahmad

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 Avancé "AUTRE section en activant tiliser l'agrégation: Oui
3. Dans CHAMPS ou FILTER CRITERIA section, sélectionnez et appliquez Paramètres d'agrégation pour quels champs vous voulez grouper par ou distinct.

19
Sithu

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 Avancé "AUTRE, cliquez sur" Paramètre de requête "
  3. Cochez la case "Distinct".
39
Eugene Fidelin

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 Avancé "AUTRE, cliquez sur" Paramètre de requête "
  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.
8
no name

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. Ensuite, il ajoute 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/15

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

5
Patrick

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 qui a plusieurs valeurs peut apparaître dans la vue une fois par valeur dans le champ à plusieurs valeurs. 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. Vues distinctes vise à fournir une méthode graphique simple pour supprimer ou agréger ces lignes "en double".

4
雨滴米

J'ai plusieurs Date fields et souhaitez trier par début de FIRST date... Voici comment cela a fonctionné: Dans Views->advanced->Other: use aggregation: YES Et alors: SORT CRITERIA->Aggregation settings->Aggregation type: COUNT

Je m'attendais à ce que count me donne le numéro au lieu de l'instance, mais cela rendait le résultat distinct ...

0
Amadeus

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 toujours en D7 .

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 cela 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 une solution à cela, veuillez commenter!

0
leymannx

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 à l'aide de 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
Mike Pfeiffer

Pas pour 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
Bryan