Mehrere Einträge aus einem DB-Feld getrennt auslesen

27apricot

Erfahrenes Mitglied
Hallo,

ich hab' eine DB-Tabelle (Tabelle 1), in der es ein Feld für eine ID aus einer anderen Tabelle (Tabelle 2) gibt für die Verknüpfung mit einem assoziierten Thema.

Wenn es jetzt aus dieser zweiten Tabelle aber mehrere assoziierte Einträge gibt, wie trag' ich die in das eine Feld der ersten Tabelle ein und wie lese ich sie aus?

Eintrag z.B. '5' und '6'.
Ausgabe:

PHP:
// code für seite_tabelle1.php
echo "
<a href=\"seite_tabelle2.php?id=5\">verknüpfung eins<\a>
<a href=\"seite_tabelle2.php?id=6\">verknüpfung zwei<\a>
";

Danke schonmal im Voraus.
27apricot.
 
erstell doch einfach mehrere Einträge mit je einer ID aus der anderen Tabelle und dem selben betroffenen Thema - dann kannste eine WHERE Abfrage auf das Thema machen und erhälst alle IDs
 
Hallo allerseits und danke!

hab' inzwischen die Funktion strtok() gefunden und die funktioniert prima. Sie zerlegt einen String in seine Einzelteile mit vordefinierten Trennzeichen.

In Tabelle 1 steht jetzt im Feld 'tabelle2_id' z.B. '5,6'
In der Funktion strtok() definiere ich das Komma als Trennzeichen und kann mit einer while-Schleife am Ende zwei Links ausgeben:
Nr. 1 mit der ID 5,
Nr. 2 mit der ID 6

PHP:
// code für seite_tabelle1.php
$id_einzeln = strtok($tabelle2_id, ",");
while (id_einzeln) {
    echo "<a href=\"seite_tabelle2.php?id=$id_einzeln\">Verknüpfung<\a>";
    $id_einzeln = strtok(",");
}

Vielen Dank trotzdem,
27apricot
 
Auch, wenn Du das Thema bereits als erledigt betrachtest, möchte ich Dich im Sinne eines "richtigen" Datenbankdesign auf die Normalisierung hinweisen.
Deine Variante widerspricht bereits der ersten Normalform.
Man sollte das, was Du machst über eine weitere Tabelle in der Datenbank lösen.
Diese enthält zwei Spalten, zum einen die ID des Eintrags (aus Tabelle 1), in dem weiterführende Links auftauchen sollen und zum anderen eine Spalte mit der ID aus Tabelle 2 mit dem assozierten Thema.
Für jedes assozierte Thema zu einem Eintrag aus Tabelle 1 entsteht eine Zeile in dieser Tabelle.
Angenommen, Du willst dem Thema mit der ID "1" aus Tabelle 1 die Themen "3", "4" und "7" aus Tabelle 2 zuordnen, stehen in der Tabelle folgende Zeilen:
Code:
topicID | relatedTopicID
1       | 3
1       | 4
1       | 7

Gruß hpvw
 
Hallo hpvw,

war ein paar Tage im Urlaub, deswegen erst jetzt die Antwort. Danke erstmal für deinen Kommentar. Hab' mal versucht, mich bei Wikipedia in das Thema einzulesen.

Die NF1 verstehe ich zwar, weiß aber noch nicht, WARUM ein Attribut atomar sein sollte (und genau darum geht es dir ja).

NF2 leuchtet mir in dem bei Wikipedia aufgeführten Beispiel auch ein. Aus diesem Grund hab' ich mir mal eine solche veranschaulichende Darstellung für mein Thema erstellt und denke, dass das Problem in dem Falle nicht vorhanden ist.

Das ist die vereinfachte Darstellung der Tabellen, wie sie jetzt sind:

HTML:
Tabelle 1:
ID	TITEL		REL_ID_TAB2
1	soundso		5
2	auchnoch	5
3	achso		6,7

Tabelle 2:
ID	THEMA
5	diesunddas
6	jenes
7	auchdasnoch

Mit Hilfe des Scripts, durch das Tabelle 1 ausgelesen wird, erscheint/erscheinen ein oder eben mehrere Link(s) zu entsprechenden Einträgen aus Tabelle zwei, die durch ein anderes Script ausgelesen werden.
Schalte ich dort noch eine Tabelle dazwischen, wird das ganze doch nur wesentlich unübersichtlicher und es können sich in der Administration wesentlich mehr Fehler einschleichen. So wie es jetzt ist, wird die REL_ID_TAB2 in Tabelle 1 geändert, sobald in Tabelle 2 der dazugehörige Eintrag geändert wird. Was kann da - vorausgesetzt die Scripte sind richtig - schief gehen?

Danke schonmal.
27apricot
 
(Die erste Normalform ist Bedingung für die zweite Normalform.)

Ich gehe mal von folgenden Tabellen aus (und ignoriere erstmal, dass es bestimmt auch ein Inhaltsfeld mit Text und weiteres gibt):
Code:
Tabelle1:
ID | Titel

Tabelle2:
ID | Titel

Relation
Tabelle1ID | Tabelle2ID
Folgendes MySQL-Query gibt Dir alle verknüpften Artikel aus Tabelle2 zu dem Artikel aus Tabelle1 mit der ID $tabelle1ID:
Code:
SELECT * FROM Tabelle2 JOIN Relation ON (Relation.Tabelle2ID = Tabelle2.ID) WHERE Relation.Tabelle1ID=$tabelle1ID;
MySQL bietet auch die Möglichkeit, die referentielle Integrität sicherstellen, indem Du Relation.Tabelle2ID mit Tabelle2.ID verknüpfst. Dann würden theoretisch alle passenden Zeilen in Relation automatisch gelöscht, wenn Du einen Eintrag aus Tabelle2 löscht. Entsprechend auch die Verknüpfung zur Tabelle1.
Wie das geht, kann ich Dir nicht genau sagen, da ich der Sache noch nicht so ganz traue.
Aber Du kannst mit 2 Querys die referentielle Integrität selbst sicherstellen, ohne dass Du Dir alle Einträge in Tabelle 1 einzeln anschauen musst und die entsprechende ID dann aus Deinem Array entfernst.
Angenommen, Du willst den Artikel in Tabelle2 mit der ID 3 löschen:
Code:
DELETE FROM Tabelle2 WHERE ID=3;
DELETE FROM Relation WHERE Tabelle2ID=3;

Wenn Du in Tabelle2 einen Eintrag änderst kann eigentlich nie etwas schief gehen, da er seine ID behält.
Wenn Du in Tabelle 2 einen Eintrag löscht, sparst Du Dir mit oben angesprochenem Query eine Menge Arbeit und Serverlast.
Wenn Du einen Eintrag aus Tabelle2 zusätzlich verknüpfen willst sparst Du Dir ebenfalls eine Menge Arbeit. Du musst nicht den Eintrag in Tabelle1 auslesen, die ID als String anfügen und Dein Update durchführen, sondern fügst einfach eine neue Zeile in Relation ein.

Auf den ersten Blick mag das für einen Neuling (entschuldige bitte, wenn ich Dich falsch einschätze) unübersichtlicher aussehen, aber, wenn man etwas mehr mit Datenbanken macht und auch andere Datenbanken gesehen hat, wird man erkennen dass dies die (einzig richtige) Art ist, um m zu n Beziehungen darzustellen.

Die Normalisierung ziehlt vor allem auf die referentielle integrität und die Redundanzfreiheit ab.
Ein anderer Aspekt ist aber auch, dass sich "normale" Datenbanken wesentlich leichter erweitern lassen.
Stell Dir vor, Du möchtest zum Beispiel später die Art der Verknüpfung festlegen. Bei Themen zum Beispiel "Vertiefung des Themas" und "gegensätzliche Meinung".
Dann würdest Du eine Tabelle Verknüpfungsbeschreibung mit ID und Beschreibung erstellen und der Relationtabelle ein weiteres Attribut VerknüpfungsbeschreibungsID anfügen (attributierte m zu n Beziehung).

Du kannst auf diese Art auch wesentlich einfacher viele Dinge bereits in Deinem SQL-Statement abhandeln, ohne jedesmal alles noch in PHP verarbeiten zu müssen.

Ich hoffe, ich konnte Dir weiterhelfen
Gruß hpvw

PS: Erschrick nicht zu sehr vor der Normalisierung, für private Datenbanken genügt es in der Regel, wenn Du die 1., 2. und 3. Normalform erfüllst.
 
Zurück