phpbar.de logo

Mailinglisten-Archive

[php] AW: [php] verschachteltes fetch_row

[php] AW: [php] verschachteltes fetch_row

Kristian =?iso-8859-1?Q?K=F6hntopp?= kk_(at)_netuse.de
Mon, 15 Nov 1999 19:25:15 +0100


> Den einzelnen Datensaetzen moechte ich wiederum eine Liste
> zufuegen.
> 
> Beispiel:
> 
> Datensatz 1
>  Unterdatensatz 1.1
>  Unterdatensatz 1.2
>  Unterdatensatz 1.3
> Datensatz 2
>  Unterdatensatz 2.1
>  Unterdatensatz 2.2
>  Unterdatensatz 2.3
> Datensatz 3
> ...

Dies ist eine klassische 1:N Relation zwischen zwei Tabellen,
bei der eine Gruppierung der N-Seite der Relation nach den 
Titeln der 1-Seite der Relation erfolgen soll. Dies kann
man mit einer einzigen Query erledigen, wobei bei der Ausgabe
überzählige "Titel" der 1-Seite weggelassen werden können.

Zur Query:

Sei t1 die Tabelle der Datensätze, mit dem PRIMARY KEY t1.id1.
Sei t2 die Tabelle der Unterdatensätze, mit dem PRIMARY KEY
t2.id2. Sei t2.t1_id1 FOREIGN KEY in t1, d.h. an jedem Unterdatensatz
t2.id2 klebe die Nummer des ihm zugeordneten Datensatzes aus t1.

Dann kannst Du mit

SELECT t1.id1 as t1_id1
     , t1.text as t1_text
     , t2.id2 as t2_id2
     , t2.t1_id1 as t2_t1_id1
     , t2.text as t2_text
  FROM t1, t2
 WHERE t1.id1 = t2.t1_id1
   AND $additional_constraint
ORDER BY t1.id1, t2.id2

die von Dir gewünschte Information in der von Dir gewünschten Ordnung
bekommen. Die Query ist nur dann schnell, wenn t2.t1_id1 ein INDEX ist.


Zur Darstellung:

Die von Dir gewünschte Darstellung kannst Du nur bekommen, wenn Du
manuell formatierst. Dies kann wie folgt geschehen (Query mit DB_Sql
von PHPLIB notiert):

$db = new DB_Example;
$query = "<wie oben>";
$db->query($query);

$oldid1 = "";
while($db->next_record()) {
  $id1   = $db->f("t1_id1");
  $text1 = $db->f("t1_text");
  $id2   = $db->f("t2_id2");
  $t1ref = $db->f("t2_t1_id1");
  $text2 = $db->f("t2_text");
  if ($oldid1 != $id1) {
    print_master_line($id1, $text1);
    $oldid1 = $id1;
  }
  print_detail_line($id2, $t1ref, $text2);
}

Die Funktion print_master_line druckt dabei eine Überschrift,
die Funktion print_detail_line druckt dabei jeweils eine Detailzeile.

Kristian

-- 
Kristian Köhntopp, NetUSE Kommunikationstechnologie GmbH
Siemenswall, D-24107 Kiel, Germany, +49 431 386 436 00
Using PHP3? See our web development library at
http://phplib.netuse.de/ (We have moved! Update your bookmarks!)


php::bar PHP Wiki   -   Listenarchive