Nodes mit bestimmten Eigenschaften zählen + Versionierung
am 17.02.2008 - 11:55 Uhr in
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
- Anmelden oder Registrieren um Kommentare zu schreiben
Re: Nodes mit bestimmten Eigenschaften zählen + Versionierung
am 19.02.2008 - 02:29 Uhr
Gehen wir mal von aussen nach innen:
{node}
hatnid
als Primärschlüssel: ein Node kann eindeutig anhand seinernid
identifiziert werden.{node_revisions}
hatvid
als Primärschlüssel: eine Revision eines Nodes kann eindeutig anhand seinervid
identifiziert werden.{content_field_jahr}
) habenvid
als Primärschlüssel, weil das Feld in unterschiedlichen Revisionen des gleichen Nodes unterschiedliche Einträge haben können soll. Das Feldnid
ist redundant, da anhand vonvid
aufnid
geschlossen werden kann (über die Tabelle{node_revisions}
). Die Spaltedelta
ist vorhanden, weil CCK mehrere Einträge pro Feld zulässt (bei entsprechender Konfiguration des Feldes).Gibt es generell zum Zählen von Nodes etwas, was die API bereitstellt?
Nein.
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. wegennode_db_rewrite_sql
).--
Hallo Oswald, erst einmal
am 19.02.2008 - 13:08 Uhr
Hallo Oswald,
erst einmal vielen Dank. Deine Erklärung und dein Snippet haben mir sehr geholfen.
Übrigens: denk an
db_rewrite_sql
, sonst bekommst du Nodes, die du evtl überhaupt nicht zählen willst (z.B. wegennode_db_rewrite_sql
).Gibt es dafür irgendwo mehr Erklärung, als die API Handbuchseiten?
ciao, Ronald
Ich habe keine weitere
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 vonhook_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.--
Danke für den Hinweis.
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