Wie entferne ich Duplikate, wenn ich die Zufallssortierung verwende?

31

Ich habe eine Ansicht erstellt, in der der Knotentitel und ein Logo (ein Cck-Feld) angezeigt werden. In den Argumenten habe ich den Taxonomiebegriff name übergeben.

Im Ergebnis zeigt ein Knoten zwei- oder dreimal an. Ich habe das Kontrollkästchen in den Abfrageeinstellungen bereits aktiviert, aber das funktioniert auch nicht. Ich habe die zufällige Sortierung verwendet, die die Duplikate zu verursachen scheint. Wenn ich die zufällige Sortierung entferne, funktioniert es einwandfrei.

Wie kann ich die Duplikate vermeiden, ohne die zufällige Sortierung zu deaktivieren?

Ahmad
quelle
es wäre eigentlich nett, wenn jemand den / die Grund (e) für die Duplikate und die Gegenmaßnahmen erläutert. mit 5 Lösungen, die 'vielleicht' funktionieren, ist nur
halboptimal

Antworten:

19

Sie können GROUP BY oder DISTINCT anwenden, indem Sie die Aggregationseinstellungen für Ansichten aktivieren, um doppelte Datensätze zu entfernen.
1. Gehen Sie und bearbeiten Sie Ihre Ansicht
2. Erweiterte »ANDERE Abschnitt durch Aktivierung Verwenden Aggregation: Ja
3. In FIELDS oder Filterkriterien Abschnitt auswählen und anwenden Aggregationseinstellungen für die Felder , die Sie gruppieren möchten oder verschieden.

Sithu
quelle
2
Ich habe das Beispielproblem, ich aktiviere die Verwendung der Aggregation und in meinem Feld gibt es keine distinctAuswahl, welchen Typ ich unter Aggregationstyp auswählen soll.
Yusef
39

Der einfache Weg, eindeutige Werte in einer Ansicht zu erzielen, besteht darin, Folgendes zu tun:

  1. Gehen Sie und bearbeiten Sie Ihre Ansicht
  2. Klicken Sie im Abschnitt Erweitert »SONSTIGES auf" Abfrageeinstellung ".
  3. Aktivieren Sie das Kontrollkästchen "Distinct".
Eugene Fidelin
quelle
In meiner Frage habe ich bereits erwähnt, dass ich die Option Distinct in den Abfrageeinstellungen aktiviert habe.
Ahmad
Eugene und Clive, es ist Arbeit, vielen Dank für das Teilen.
8

Die einfache Möglichkeit, mit Ansichten eindeutige Werte zu erzielen, besteht darin, Folgendes zu tun:

  1. Gehen Sie und bearbeiten Sie Ihre Ansicht
  2. Klicken Sie im Abschnitt Erweitert »SONSTIGES auf" Abfrageeinstellung ".
  3. Aktivieren Sie das Kontrollkästchen "Distinct".

Sie können GROUP BY oder DISTINCT anwenden, indem Sie die Aggregationseinstellungen für Ansichten aktivieren, um doppelte Datensätze zu entfernen.

  1. Gehen Sie und bearbeiten Sie Ihre Ansicht
  2. Aktivieren Sie im Abschnitt Erweitert »SONSTIGES die Option Aggregation verwenden: Ja
  3. Wählen Sie im Abschnitt FELDER oder FILTERKRITERIEN die Aggregationseinstellungen aus, nach denen Sie die Felder gruppieren oder die Sie unterscheiden möchten, und wenden Sie sie an.
kein Name
quelle
5

Ich weiß, dass diese Frage bereits beantwortet wurde, aber für einige Anwendungen funktionieren diese Lösungen nicht. Nach einigen Recherchen fand ich jedoch eine Lösung, die für meine Bedürfnisse geeignet ist.

Ich habe eine wirklich nützliche Problemumgehung gefunden, mit der ich das beheben konnte. Ich habe das Code-Snippet auf DropBucket gepostet. Grundsätzlich implementieren Sie einen Drupal 7-Abfrageänderungs-Hook, der alle Ansichtenabfragen auf Abfragekommentare überprüft, die eine groupby-Klausel und ein groupby-Feld angeben. Dann wird diese Gruppe zur SQL-Abfrage hinzugefügt.

/**
 *  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

Der Quellverweis befindet sich in den Kommentaren auf der Seite.

Patrick
quelle
Ich möchte hinzufügen, dass es bekannte Probleme mit DISTINCT gibt, die in Ansichten 3.3 und höher nicht richtig funktionieren.
Patrick
1
Stattdessen können Sie einfach den Namen der Ansicht überprüfen und die Gruppe nach hinzufügen.
Potney Switters
Es funktioniert super Keine der Lösungen hier funktionierte für mich außer dieser ... Codierung
rockt
4

Ich hatte das gleiche problem Letztendlich habe ich es gelöst, indem ich das Views Distinct- Modul installiert habe .

Beziehungen oder andere Verknüpfungen in Ansichten führen häufig zu "doppelten" Ergebnissen. Beispielsweise kann ein Knoten mit einem Feld mit mehreren Werten in der Ansicht einmal pro Wert im Feld mit mehreren Werten angezeigt werden. Es ist frustrierend und die SQL-Abfrageoption "DISTINCT" in der Benutzeroberfläche "Ansichten" löst das Problem nicht wirklich, da die Ergebniszeile technisch unterschiedlich ist. Views Distinct bietet eine einfache GUI-Methode zum Entfernen oder Zusammenfassen dieser "doppelten" Zeilen.

雨滴 雨滴
quelle
0

Hatte Probleme mit mehrwertigen Datumsfeldern. Die Elemente wurden so oft angezeigt, wie ein Datum eingegeben wurde. Keine der anderen hier genannten Lösungen hat für mich funktioniert. Aber dann fand ich eine D6 - Lösung , die funktioniert immer noch in D7 gibt .

hook_views_pre_render(&$view)ist das Zauberwort. Im Beispiel ist es auf eine bestimmte Anzeige einer bestimmten Ansicht beschränkt. Ich hoffe es hilft.

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

BEARBEITEN: Leider subtrahiert dieser die Anzahl der doppelten Elemente von der Ansicht, wenn ein Limit festgelegt wurde. Wenn jemand vielleicht eine Lösung dafür findet, bitte kommentieren!

leymannx
quelle
0

Um einen alten Thread nicht aufzuwecken, aber die Antwort (wenn Sie Drupal 7 und einen exponierten Suchfilter verwenden) lautet "Suchergebnis entfernen" unter "Suche: Suchbegriffe".

Unter "Filterkriterien"

Add "Suche: Suchbegriffe"

Aktivieren Sie "Suchergebnis entfernen"

Klicken Sie auf "Übernehmen (alle Anzeigen)".

Klicken Sie auf Speichern

Bryan
quelle
0

Keine dieser anderen Methoden hat bei mir funktioniert, aber das Views Random Seed- Modul hat tatsächlich den Trick gemacht. Meine Probleme betrafen jedoch eher die Verwendung eines Pagers. Hier ist ein Zitat von der Projektseite dieses Moduls:

Fügt einen zufälligen Orderhandler mit Seed hinzu. Wenn in der Funktion sql RAND () ein konstantes ganzzahliges Argument N angegeben ist, wird es als Startwert verwendet, der eine wiederholbare Folge von Spaltenwerten erzeugt. Dies macht es möglich, dass Seitenwechsel stattfinden und Elemente nicht zweimal angezeigt werden. Es ist auch möglich, einen benutzerdefinierten Startwert mit PHP zu berechnen, sodass Sie Pseudo-Zufallszahlen basierend auf Variablen wie dem Datum des Tages erstellen können.

Mike Pfeiffer
quelle
0

Ich habe mehrere Date fieldsund möchte bis zum Anfang sortieren FIRST date... So hat es funktioniert: In Views->advanced->Other: use aggregation: YES Und dann: SORT CRITERIA->Aggregation settings->Aggregation type: COUNT

Ich hatte erwartet count, mir die Nummer anstelle der Instanz zu geben, aber das Ergebnis wurde dadurch deutlich ...

Amadeus
quelle