Drupal Modulentwicklung - SQL Unterabfrage

Es kann eforderlich sein in einem DB Query mit Unterabfragen, Subqueries, zu arbeiten.

Problem dabei ist die korrekte Handhabung damit in der Unterabfrage Werte aus der sie umgebenden Abfrage zur Verfügung stehen.

Abfrage ohne Subquery

$query = db_query(db_rewrite_sql("SELECT DISTINCT n.nid FROM {node} WHERE n.type = 'blog' AND n.status = 1 AND n.uid <> 0"));

Abfrage mit Subquery

$query = db_query(db_rewrite_sql("SELECT DISTINCT @uid:=n.uid, n.nid FROM, (SELECT b.created FROM {node} b WHERE b.type = 'blog' AND b.uid = @uid ORDER BY b.created ASC LIMIT 1) AS oldest {node} WHERE n.type = 'blog' AND n.status = 1 AND n.uid <> 0"));

Der Sinn der Abfrage ist hier nicht die Frage. Mit einem Join könnte man den Query im Falle des Beispielcode ebenso realisieren.

Es geht wie gesagt um die Query-Syntax bezüglich eines Subquery.

Problem mit Pager-Query

Problem bei derartigen Subqueries ist das man damit Drupals Pager-Queries realisieren muss. Das bedeutet, dieser Query

$query = pager_query(db_rewrite_sql("SELECT DISTINCT @uid:=n.uid, n.nid FROM, (SELECT b.created FROM {node} b WHERE b.type = 'blog' AND b.uid = @uid ORDER BY b.created ASC LIMIT 1) AS oldest {node} WHERE n.type = 'blog' AND n.status = 1 AND n.uid <> 0". tablesort_sql($header)), $rows);

wird zwar keinen Fehler produzieren aber es wird zunächst kein Pager angezeigt.

Ursache dabei ist die Variable $pager_total in der Datei pager.inc. Sie ist leer bzw. der 1. Wert im Array ist 0.

Wer das Problem mit dem Pager lösen will sollte sich die Datei statistics.admin.inc ansehen.

Powered by Drupal. Created with ZenWalk.