phpbar.de logo

Mailinglisten-Archive

[php] Kreuztabelle aus 2 DB-Tables

[php] Kreuztabelle aus 2 DB-Tables

Lutz Zetzsche Lutz.Zetzsche at sea-rescue.de
Die Mar 2 09:49:27 CET 2004


Hi Christian,

sorry fuer die verspaetete Antwort. Die Antwort auf Deine Frage ist etwas
umfangreicher, und leider fand ich gestern dafuer nicht mehr genug Zeit. Aber
jetzt... :-)


Zitat von Christian Vosen:

> Lutz Zetzsche schrieb:
>
> > Solange das Datum gleichbleibt, laeufst Du fuer alle Kategorien von links
> nach
> > rechts durch und guckst, ob Du zu der jeweiligen Kategorie einen passenden
> > Datumsdatensatz hast (horizontale Laufrichtung). Wenn ja, machst Du eine
> > Markierung in die HTML-Tabellenzelle. :-)
>
> Wie mache ich das Durchlaufen von links nach rechts? Hast du da mal ein
> Beispiel? Hab wohl immer noch ein Brett vor dem Kopf. Mache ich das mit
> einer IF-Abfrage?
>
> > Usw. So in etwa koennte es aussehen, wenn ich Dich richtig verstanden habe.
> > Vielleicht kannst Du noch etwas mehr Informationen geben.
>
> Hört sich auf jeden Fall so an, dass du mich richtig verstanden hast.
> Trotzdem ein paar mehr Infos:
>
> Die Termin-Tabelle in der DB hat folgende Felder: id, Startdatum (Date),
> Enddatum (Date), Beschreibung, KatID
> Dazu die Kategorie-Tabelle: KatID, Beschreibung
>
> Wenn es z.B. 2 Kategorien (z.B. 2+4) an einem Termin gibt, dann soll das
> ganze so aussehen:
>
> <tr>
> 	<td>Startdatum</td>
> 	<td>&nbsp;</td>
> 	<td>Terminbeschreibung 1</td>
> 	<td&nbsp;</td>
> 	<td>Terminbeschreibung 2</td>
> </tr>
>
> wobei die Kategoriebeschreibungen schon in den jeweiligen Spalten der
> Kopfzeile stehen.

ausnahmsweise zitiere ich Dich mal voll, weil meine Antwort sich teilweise auf
mehrere Stellen bezieht.

Zunaechst einmal scheint es mir fast, dass Du einen kleinen Design-Fehler in der
Datenbank hast. Wenn ich das richtig sehe, muss Du einen Termin mehreren
Kategorien zuordnen koennen und eine Kategorie mehreren Terminen. D.h. es waere
ideal, um keine Daten mehrfach ablegen zu muessen, wenn Du fuer diese
m:n-Beziehungen eine Verknuepfungstabelle einfuehren wuerdest. Du haettest dann
folgende Tabellen:

  - termine:		terminID, startDatum, endDatum, beschreibung
  - kategorien:		kategorieID, beschreibung
  - verknuepfungen:	VerknuepfungID, terminID, kategorieID

Davon gehe ich jetzt mal als Grundlage aus.

Um nun Deine Zeilen aufzubauen, benoetigst Du die Termine. Um die Spalten
aufzubauen, benoetigst Du zusaetzlich die Kategorien. Jedenfalls wenn ich
richtig verstanden habe, was Du moechtest. Anschliessend laeufst Du dann die
Termine durch und innerhalb der Termine die Kategorien. Das Ganze koennte
folgendermassen aussehen (UNGETESTET!):


1. Termine holen:

select distinct termine.*, kategorieID from termine, kategorien, verknuepfungen
where termine.terminID=verknuepfungen.termineID and
verknuepfungen.kategorieID=kategorien.kategorieID order by termine.startDatum
desc, termine.endDatum desc, termine.terminID asc, kategorien.kategorieID asc


2. Kategorien holen:

select distinct * from kategorien order by kategorien.kategorieID asc


3. Termine und Kategorien ausgeben:

Wichtig ist hier fuer die folgenden Schleifendurchlaeufe, dass unter 1. erst
nach terminID und dann nach kategorieID sortiert wird und unter 2. analog nach
kategorieID, wobei bei kategorieID unter 1. und 2. die gleiche Reihenfolge (asc
oder desc) angegeben sein muss. Sonst geht in den Schleifendurchlaeufen die
Zuordnung zwischen Terminen und Kategorien verloren.

Das Ergebnis aus 1. sieht ja z.B. so aus:

1 | 2004-01-01 - 2004-01-31 | Beschreibung... | Kategorie 1
1 | 2004-01-01 - 2004-01-31 | Beschreibung... | Kategorie 2
1 | 2004-01-01 - 2004-01-31 | Beschreibung... | Kategorie 4
2 | 2004-02-29 - 2004-03-01 | Beschreibung... | Kategorie 2
2 | 2004-02-29 - 2004-03-01 | Beschreibung... | Kategorie 3

Und das Ergebnis aus 2. z.B. so:

1 | Beschreibung...
2 | Beschreibung...
3 | Beschreibung...
4 | Beschreibung...

Nun machst Du folgendes:

Du durchlaeufst ganz normal das Ergebnis aus 1. Das sind im Beispiel hier ja
fuenf Zeilen. Nach Deiner HTML-Tabellenlogik bilden die ersten drei Termine die
Zeile 1 der HTML-Ausgabetabelle und die letzten beiden Termine die Zeile 2.

Wann Du eine neue Terminzeile in der HTML-Ausgabetabelle anfaengst, kannst Du
ueber die terminID steuern. Wenn die terminID gegenueber der vorigen wechselt,
dann beginnt ein neuer Termin und damit eine neue Terminzeile in der
HTML-Ausgabetabelle.

Wenn Du eine neue Ausgabezeile beginnst, dann baust Du nach der Terminspalte die
folgenden Kategoriespalten ueber die gezogenen Kategorien aus 2. auf. Die
durchlaeust Du von vorne nach hinten. Parallel durchlaeufst Du die Termine und
pruefst, ob der Termin der aktuellen Kategorie zugeordnet ist. Wenn es zu der
Kategorie eine Terminzuordnung gibt, dann fuellst Du die Kategoriezelle in der
HTML-Tabellenzeile entsprechend. Sonst bleibt sie leer.

Kommst Du damit weiter? Sonst muesste ich mal den Code zusammenbasteln. Das
wuerde aber etwas dauern. :-)


Viele Gruesse

Lutz

php::bar PHP Wiki   -   Listenarchive