PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Komplexe Abfrage seitenweise darstellen



stefaan
01-03-2004, 21:38
Servus!

Ich habe für einen Veranstaltungskalender eine Datenbank, die jeweils eine 1:n Abfrage zu Referenten und Kontakte bereitstellt, d.h. zu jedem Termin sind mehrere Referenten/Kontakte möglich.

Derzeit geht das mit 3 Abfragen (Termine, Referenten, Kontakte), die ich so sortieren kann, dass ich sie in jeweils in ein Array bekomme:
$termine[$i]
$kontakt[$i][$j]
$referenten[$i][$j]
Mit Smarty kann ich dann eine schöne Auflistung aller Termine erstellen.

Nur wenn ich die Terminabfrage ganz vorne beginne, dann kann ich die Kontakte/Referenten nicht mehr richtig zuordnen, da mir das ganze verrutscht.

SQL für Termine ($termine)


SELECT t_termine.id AS termin_id,
t_termine.titel AS termin_titel,
t_termine.start,
[..]
FROM t_termine, t_orte, ...
WHERE t_orte.id = t_termine.ort
AND t_termine.arg1 = $arg1
AND t_termine.arg2 = $arg2
AND t_termine.start >= CURRENT_DATE
ORDER BY t_termine.start ASC, termin_id ASC

SQL für Kontakte ($kontakte), Referenten ($referenten) ist ziemlich ident:


SELECT t_referenten.id AS referenten_id,
t_referenten.vorname AS referenten_vorname,
t_referenten.nachname AS referenten_nachname,
[...]
FROM t_referenten, t_termine, t_term_ref
WHERE t_referenten.id= t_term_ref.referenten
AND t_term_ref.termine = t_termine.referenten
AND t_termine.arg1 = $arg1
AND t_termine.arg2 = $arg2
AND t_termine.start >= CURRENT_DATE
ORDER BY t_termine.start ASC, termine_id ASC


Die Zuordnung $termine[$i] und $refernten[$i] erfolgt so:


while ($row = $res->fetchRow(DB_FETCHMODE_ASSOC)) {

if($row['termine_id'] == $termine[$i]['termin_id']) {

$referenten[$i][$j]['referenten_id'] = $row['referenten_id'];
[...]
$j++;

}
else {
$i++;
$j=0;
if($row['termine_id'] == $termine[$i]['termin_id']) {

$referenten[$i][$j]['referenten_id'] = $row['referenten_id'];
[...]

$j++;

}
else {
echo "<!--Fehler bei der Zuordnung, Referenten (ID):" . $row['termine_id']. $row['referenten_nachname'] . "-->\n";
}

}

}

Das funktioniert, solange alle 3 Abfragen einen gleichen Beginnzeitpunkt haben, sprich, nicht, wenn ich die erste Abfrage limitiere.
Gibts da eine sinnvolle Möglichkeiten, eine Ausgabe von z.B. 10 Datensätzen pro Seite zu liefern, ohne die Abfrage rekursiv gestalten zu müssen?

Danke!

Grüße, Stefan

undefined
02-03-2004, 08:22
Es genügen eigentlich zwei SQL abfragen. Eine in der du die Summe der Einträge und die ID's nimmst. Dieses ergebnis mit Array_chunk aufteilen und immer das erste und letzte ID_Element verwendest um die zweite Abfrage zu gestalten.

stefaan
02-03-2004, 18:33
Servus!

Danke für den Hinweis! Hättest du ev. ein kurzes Bsp. dafür, ich kann mir das nicht so ganz vorstellen...

Grüße, Stefan

undefined
03-03-2004, 08:56
<?php
// Beispiel Array
$arr = range(1,76);
$arr = array_chunk($arr, 10);
print_r($arr);
echo "<br /> <br />";

$neu = array();
for ($i = 0; $i < count($arr); $i++) {
if (count($arr[$i]) >= 2) {
$a = array_shift($arr[$i]);
$b = array_pop($arr[$i]);
}
$neu[$i] = "WHERE (id >= '$a' AND id <= '$b')";
unset($a, $b);
}
unset ($arr);

echo "<pre>";
// Abfrage Array
print_r($neu);
echo "</pre>";
?>
Noch ein paar Sicherheitsabfragen hinzu und dann geht das schon,
Bei $_GET kannst du das ganze mit einer Session steuern ;)