Zwei Tabellen mittels dritter Tabelle verknüpfen?

hoktar

Mitglied
Hallo, ich hab ein Problem, und zwar hab ich zwei Tabellen:

Eine für die Infos zu einer Datei die hochgeladen werden kann.
Und eine für die Tags die man dazu schreiben kann. Nachdem man ja mehrere Tags schreiben kann werden die eben in eine eigene Datei ausgelagert..
Code:
T_DATEI
    Id
    Name
    Pfad
    Infos

T_TAGS
    Id
    Tagwort

Und dann hab ich noch eine weitere Tabelle für die Relationen:

Code:
T_DATEI-TAG
    Datei_ID
    Tag_ID

Immer wenn eine Datei hochgeladen wird, werden die Daten und die Tags in den jeweiligen Tabellen gespeichert, soweit so gut.

Nur will ich natürlich auch, dass dabei dann auch die Datensätze jeweils verknüpft werden also in der Relationentabelle immer die zugehörigen IDs gespeichert werden. Das Problem ist nur, wenn ich die Datensätze erst speicher in den beiden Tabellen, weiß ich ja noch nicht welche ID sie haben werden (auto increment), also kann ich die beiden IDs auch nicht in die Relationentabelle schreiben!
Ich hab keine Ahnung wie ich das lösen kann, bin für jede Hilfe dankbar!
 
Was für eine Datenbank und was für eine Programmiersprache?

Wenn die Datenbank/Programmiersprache nix spezielles anbietet kann man immer noch gleich nach dem INSERT die höchste ID auslesen

SQL:
SELECT MAX(id) FROM myTable

Aber wie gesagt, wenn die DB oder/und die Programmiersprache was anbietet ists besser.
Im Beispiel PHP und MySQL währe das
PHP:
mysql_query("INSERT INTO myTable (feld1) VALUES (1)");
$id = mysql_insert_id();
 
Zuletzt bearbeitet von einem Moderator:
Ah ja vergessen ;) aber es geht eh um PHP und MySQL.
Aber zu deinem BSP, das ist ja ein ganz normaler insert into.... code?

Mein Problem ist, dass ich die ID nicht weiß, die mein Datensatz haben wird, und ich diese desshalb auch nicht in eine andere Tabelle schreiben kann.
 
Mach zuerst die insert in T_TAGS und T_DATEi. Jeweils mit mysql_insert_id() die ids rauslesen und dann daraus einen Insert für die T_DATEI-TAG erstellen.

Wenn das nicht die Lösung ist, hab ich dein Problem nicht verstanden
 
Ach soo hast du gemeint. Ja, dann hast du mich schon richtig verstanden :)

Ja die letzte ID raus zu holen war auch mein erster gedanke aber meine Bedenken waren dann, da kann sich ja dann theoretisch ein anderer Datensatz dazwischen schwindeln? Oder ist das so absolut unwahrscheinlich?
 
Ach soo hast du gemeint. Ja, dann hast du mich schon richtig verstanden :)

Ja die letzte ID raus zu holen war auch mein erster gedanke aber meine Bedenken waren dann, da kann sich ja dann theoretisch ein anderer Datensatz dazwischen schwindeln? Oder ist das so absolut unwahrscheinlich?

Schoen das du dir Gedanken ueber die DB Integritaet machst. Das last insert id wird bei mysql pro verbindung gehandhabt. Wenn du also keine persistenten Verbindungen nutzt oder selber Queries zuwischen dem insert und der Abfrage der last insert id einfuegst wird dies kein Problem sein.

Siehe auch http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html

Was fuer deine Loesung eventuell auch noch interessant waere ist die Nutzung von SQL Variablen: http://dev.mysql.com/doc/refman/5.4/en/user-variables.html
 
(Ich mach bewusst einen weitern Beitrag hier)

Hab ein neues Problem, das da dazu passt:
Wie gesagt werden die beiden normalen Tabellen durch die Verknüpfungstabelle mit den Fremdschlüsseln verknüpft.

Kann mir jemand helfen wie da die Abfrage aussehen würde, wenn ich eben jetzt über diese kleine Tabelle auf die Tags zugreifen will?
Also z.B. um mir alle Tags von der Datei mit der ID 123 aus zu geben.

Ich weiß, JOINS. Nur genau da liegt das Problem ;)

Danke schonmal :)
 
Morgen hoktar
Genau Join ist das richtige.

Wenn du wirklich nur die Tags zu einer ID und sonst keine weiteren Infios brauchst, reicht eine Verknüpfung über 2 Tabellen
SQL:
SELECT
        dt.Datei_ID,
	t.Tagwort
FROM
	T_DATEI-TAG AS dt
	JOIN T_TAGS AS t ON dt.Tag_ID = t.ID
WHERE
	dt.Datei_ID = 123;

Oder ohne Join
SQL:
SELECT
        dt.Datei_ID,
	t.Tagwort
FROM
	T_DATEI-TAG AS dt,
	T_TAGS AS t 
WHERE
        dt.Tag_ID = t.ID
	AND dt.Datei_ID = 123;

Wenn du jedoch auch noch alle Infos der Datei mit ausgeben musst, dann musst du auch diese dazuhängen
SQL:
SELECT
	d.*,
	t.Tagwort
FROM
	T_DATEI AS d
	LEFT JOIN T_DATEI-TAG AS dt ON d.ID = dt.Datei_ID
	LEFT JOIN T_TAGS AS t ON dt.Tag_ID = t.ID
WHERE
	d.ID = 123;

Der LEFT JOIN bewirkt, dass du alles der übergeorndent Tabelle nimmst und nur Details anhängst, falls vorhanden. Mit einem normalen JOIN nimmt er nur Daten der Haubttabelle, die auch Details besitzen
 
Zuletzt bearbeitet von einem Moderator:
Ah ja du hast natürlich recht, ich brauch auch die anderen Einträge.

Aber wenn ich das so mach wie beim letzten SQL, dann schaut das Ergebnis so aus, wenn ein dokument mehrere tags hat:

id: 1
name: name1
pfad: pfad1.jpg
infos: infos1
tags: tag1_a

id: 1
name: name1
pfad: pfad1.jpg
infos: infos1
tags: tag1_b

id: 1
name: name1
pfad: pfad1.jpg
infos: infos1
tags: tag1_c

und wenns nur einen tag gibt eben auch so nur halt nur einmal:

id: 2
name: name2
pfad: pfad2.jpg
infos: infos2
tags: tag2


usw
.....


Ich braäuchts aber so, dass dann ALLE tags die ein Dokument hat in dem jeweiligen array sind, nicht nur eins. Also z.B. so:

id: 1
name: name1
pfad: pfad1.jpg
infos: infos1
tags: tag1_a tag1_b tag1_c

oder wenns einfacher is:

id: 1
name: name1
pfad: pfad1.jpg
infos: infos1
tags: tag1_a
tags: tag1_b
tags: tag1_c


ginge das auch?
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück