Startseite
  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche
Startseite › Forum › Drupalcenter.de › Allgemeines zu Drupal ›

Nodes mit bestimmten Eigenschaften zählen + Versionierung

Eingetragen von rokr (593)
am 17.02.2008 - 11:55 Uhr in
  • Allgemeines zu Drupal
  • Drupal 5.x

Hallo!

Gibt es generell zum Zählen von Nodes etwas, was die API bereitstellt?

Man kann ja so ein SQL-Statement benutzen, um die Anzahl der veröffentlichten Nodes eines bestimmten Content Types (in diesem Fall "kite") zu zählen:

<?php
  $mytype
= 'kite';  //   <<---------- set your content type here.
 
$count = db_result(db_query("SELECT COUNT(DISTINCT(n.nid))
    FROM {node} n WHERE n.type='%s' AND .status=1"
, $mytype));
  echo
"$count nodes</a>";
?>

Nun möchte ich darüber hinaus ein CCK-Feld auswerten. Es sollen also nur Nodes mit einem bestimmten Wert gezählt werden. In diesem Fall sollen nur Nodes gezählt werden, die im CCK Feld "Jahr" den Wert 2008 haben. Sähe wohl so aus:

<?php
  $mytype
= 'kite';  //   <<---------- set your content type here.
 
$count = db_result(db_query("SELECT COUNT(DISTINCT(n.nid))
    FROM {node} n, {content_field_jahr} c
    WHERE n.type='%s' AND n.status=1 AND c.field_jahr_value='2008' AND n.nid = c.nid"
, $mytype, $year));
  echo
"2008: $count nodes";
?>

So weit, so gut. Der Content Type "kite" wird jedoch von Drupal versioniert. Wird also das CCK Feld "Jahr" einer Node von 2008 in 2007 geändert, führt das obige Statement dazu, dass die Node dennoch weiter mitgezählt wird, da der neue Wert in der Tabelle "content_field_jahr" lediglich hinzugefügt wird. Meine Überlegung war nun, das Ergebnis nach vid (Versions-ID) absteigend zu sortieren und auf 1 zu beschränken, also zusätzlich:

ORDER BY c.vid DESC LIMIT 1

So bekäme man den aktuellsten Wert des CCK Felds laut Versionierung.
Dabei gibt es nun das Problem, dass Nodes mehrere gültige Einträge haben können, also z.B. 2008 UND 2007 UND 2006. Also wäre die Ergebnismenge mit LIMIT 1 auch wieder fehlerhaft. Die aktuellen Einträge in der Tabelle "content_field_jahr" hätten die gleiche vid, aber nur die erste würde gefunden.

Ich fürchte, an der Stelle reichen meine SQL Grundkenntnisse nicht mehr. Gibts dafür überhaupt ein funktionierendes Statement, oder muss ich erst Werte in ein PHP Array übernehmen? Liegt die "Magie" im Wert "delta" in der Tabelle "content_field_jahr"? Also erst "delta" auswerten und dann das LIMIT der Ergebnisliste basierend auf der vid festlegen?

Hier mal das Beispiel für die Tabelle "content_field_jahr". Aktuell hat das CCK-Feld "Jahr" die gültigen Werte 2005 und 2006.

vid  delta  nid  field_jahr_value
----+------+----+----------------
274  0      211  2007
275  0      211  2008
276  0      211  2005
276  1      211  2006

Für Hinweise dankbar, Ronald

‹ Erstellung einer neuen Seite mittels Drupal Strategie bei Neuerstellung. Basis Drupal 5.x oder gleich Drupal 6.x ›
  • Anmelden oder Registrieren um Kommentare zu schreiben

Re: Nodes mit bestimmten Eigenschaften zählen + Versionierung

Eingetragen von traxer (1009)
am 19.02.2008 - 02:29 Uhr

Gehen wir mal von aussen nach innen:

  • Die Tabelle {node} hat nid als Primärschlüssel: ein Node kann eindeutig anhand seiner nid identifiziert werden.
  • Die Tabelle {node_revisions} hat vid als Primärschlüssel: eine Revision eines Nodes kann eindeutig anhand seiner vid identifiziert werden.
  • Tabellen für CCK-Felder (z.B. {content_field_jahr}) haben vid als Primärschlüssel, weil das Feld in unterschiedlichen Revisionen des gleichen Nodes unterschiedliche Einträge haben können soll. Das Feld nid ist redundant, da anhand von vid auf nid geschlossen werden kann (über die Tabelle {node_revisions}). Die Spalte delta ist vorhanden, weil CCK mehrere Einträge pro Feld zulässt (bei entsprechender Konfiguration des Feldes).
rkr@drupal.org schrieb

Gibt es generell zum Zählen von Nodes etwas, was die API bereitstellt?

Nein.

rkr@drupal.org schrieb

In diesem Fall sollen nur Nodes gezählt werden, die im CCK Feld "Jahr" den Wert 2008 haben.

SELECT COUNT(DISTINCT(n.nid))
FROM {node} n
INNER JOIN {content_field_jahr} c ON c.vid = n.vid
WHERE n.type='%s' AND n.status=1 AND c.field_jahr_value=%d

Übrigens: denk an db_rewrite_sql, sonst bekommst du Nodes, die du evtl überhaupt nicht zählen willst (z.B. wegen node_db_rewrite_sql).
--
XING

  • Anmelden oder Registrieren um Kommentare zu schreiben

Hallo Oswald, erst einmal

Eingetragen von rokr (593)
am 19.02.2008 - 13:08 Uhr

Hallo Oswald,

erst einmal vielen Dank. Deine Erklärung und dein Snippet haben mir sehr geholfen.

traxer schrieb

Übrigens: denk an db_rewrite_sql, sonst bekommst du Nodes, die du evtl überhaupt nicht zählen willst (z.B. wegen node_db_rewrite_sql).

Gibt es dafür irgendwo mehr Erklärung, als die API Handbuchseiten?

ciao, Ronald

  • Anmelden oder Registrieren um Kommentare zu schreiben

Ich habe keine weitere

Eingetragen von traxer (1009)
am 19.02.2008 - 14:02 Uhr

Ich habe keine weitere Dokumentation gefunden. Zusammengefasst kann man aber wohl sagen, das du db_rewrite_sql immer dann vorschalten solltest, wenn du Nodes, Kategorien oder Kommentare abfragst und die Ergebnisse dem Benutzer anzeigen willst. Implentierungen von hook_db_rewrite_sql schränken die Ergebnissmenge dann so ein, das der Benutzer nur die Einträge zu sehen bekommt, für die er die entsprechende Berechtigung hat.

--
XING

  • Anmelden oder Registrieren um Kommentare zu schreiben

Danke für den Hinweis.

Eingetragen von rokr (593)
am 19.02.2008 - 15:01 Uhr

Danke für den Hinweis. Daher mag ich ungern auf der nackten DB "rummachen", weil ich die durchdachten Core-Funktionen damit "umgehe", wenn ich mir der Tragweite nicht bewusst bin.

Ronald

  • Anmelden oder Registrieren um Kommentare zu schreiben

Benutzeranmeldung

  • Registrieren
  • Neues Passwort anfordern

Aktive Forenthemen

  • Medien und andere Daten mit Feeds von Drupal 7 auf Drupal 10 migrieren
  • für drupal11 ein Slider Modul
  • [gelöst] W3CSS Paragraphs Views
  • Drupal 11 neu aufsetzen und Bereiche aus 10 importieren
  • Wie erlaubt man neuen Benutzern auf die Resetseite zugreifen zu dürfen.
  • [gelöst] Anzeigeformat Text mit Bild in einem Artikel, Drupal 11
  • Social Media Buttons um Insteragram erweitern
  • Nach Installation der neuesten D10-Version kein Zugriff auf Website
  • Composer nach Umzug
  • [gelöst] Taxonomie Begriffe zeigt nicht alle Nodes an
  • Drupal 11 + Experience Builder (Canvas) + Layout Builder
  • Welche KI verwendet ihr?
Weiter

Neue Kommentare

  • Inzwischen sind wir bei
    vor 3 Tagen 59 Minuten
  • Migrieren von D7 auf D8/ D10/ D11
    vor 3 Tagen 17 Stunden
  • melde mich mal wieder, da ich
    vor 8 Wochen 21 Stunden
  • Hey danke
    vor 8 Wochen 1 Tag
  • Update: jetzt gibt's ein
    vor 8 Wochen 2 Tagen
  • Hallo, im Prinzip habe ich
    vor 8 Wochen 6 Tagen
  • Da scheint die Terminologie
    vor 8 Wochen 6 Tagen
  • Kannst doch auch alles direkt
    vor 9 Wochen 4 Tagen
  • In der entsprechenden View
    vor 9 Wochen 4 Tagen
  • Dazu müsstest Du vermutlich
    vor 9 Wochen 4 Tagen

Statistik

Beiträge im Forum: 250235
Registrierte User: 20462

Neue User:

  • marouane.blel
  • capilclinic
  • Quabzibboter

» Alle User anzeigen

User nach Punkten sortiert:
wla9461
stBorchert6003
quiptime4972
Tobias Bähr4019
bv3924
ronald3857
md3717
Thoor3678
Alexander Langer3416
Exterior2903
» User nach Punkten
Zur Zeit sind 0 User und 19 Gäste online.

Hauptmenü

  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche

Quicklinks I

  • Infos
  • Drupal Showcase
  • Installation
  • Update
  • Forum
  • Team
  • Verhaltensregeln

Quicklinks II

  • Drupal Jobs
  • FAQ
  • Drupal-Kochbuch
  • Best Practice - Drupal Sites - Guidelines
  • Drupal How To's

Quicklinks III

  • Tipps & Tricks
  • Drupal Theme System
  • Theme Handbuch
  • Leitfaden zur Entwicklung von Modulen

RSS & Twitter

  • Drupal Planet deutsch
  • RSS Feed News
  • RSS Feed Planet
  • Twitter Drupalcenter
Drupalcenter Team | Impressum & Datenschutz | Kontakt
Angetrieben von Drupal | Drupal is a registered trademark of Dries Buytaert.
Drupal Initiative - Drupal Association