[mySQL] Frage zu einen kleinen Problem

Hallo!

Und zwar habe ich eine Webseite wo man Testberichte zu Spielen schreiben kann. Es funktioniert auch alles wunderbar.

Meine Frage ist jetzt die, ich speichere vom Autor die ID zum Testbericht. Der Name des Autors kommt in eine eigene Tabelle. In letzter Zeit hatte ich aber das Problem das mehrere Autoren an einen Testbericht geschrieben haben, wie kann ich das Problem lösen? Vor allem habe ich es bisher so gemacht wenn man auf die ID vom Autor geklickt hat das dann alle seine Testberichte erschienen. Wie muss ich meine Datenbank abändern das das auch alles wie bisher funktioniert? In PHP und mySQL bin ich etwa fit, ich bräuchte nur eine kleine Hilfe wie ich das am besten lösen könnte, den Rest mache ich dann schon.

Danke im voraus.
 
Hi,

da hilft die vielbemühte Kreuztabelle

lfid | artikelid | authorid
-----------------------------------
| |


gruß

kato
 
na ja, man könnte ja auch mehrere autoren IDs bei jedem Bericht mit nem leerzeichen oder so getrennt eintragen und dann im script per explode auseinandernehmen.
 
hmm,

hab auch mal so einen Designentscheidung getroffen, das verfolgt mich immer noch.

z.B.
wenn die Qualität der einzelnen Autoren pro Artikel bewertet werden soll ist man mit eine Kreuztabelle besser dran.

gruß

kato
 
Was ist eine Kreuztabelle? Mysql.de kennt diesen Ausdruck nicht und Google spuckt mir nur sehr wirre Sachen dabei aus... könntet ihr mir das genauer erklären bzw. habt ihr einen Verweis wo Beispiele angegeben sind? Kann mir bisher nichts darunter vorstellen. Danke.
 
Was ist eine Kreuztabelle? Mysql.de kennt diesen Ausdruck nicht und Google spuckt mir nur sehr wirre Sachen dabei aus... könntet ihr mir das genauer erklären bzw. habt ihr einen Verweis wo Beispiele angegeben sind? Kann mir bisher nichts darunter vorstellen. Danke.

eine kreuztabelle ist nix anders als eine Kombination aller werte aus zwei Tabellen.

Tabelle A;
1
2
3
Tabelle B;
A
B
C

Kreuztabelle:
A1
A2
A3
B1
B2
B3
C1
C2
C3

in diesem Zusammenhang ist der Begriff vielleicht nicht ganz eindeutig. da in der (Kreuz)Tabelle nicht alle Möglichkeiten eigetragen werden. sondern nur die validen Kombinationen. aus Artikel und Autor(en)

Gruß

kato
 
Kreuztabelle ist auch nicht der richtige Ausdruck dafür - genauer gesagt mit einer Kreuztabelle kannst du hier gar nichts anfangen (im Normalfall solltest du danach streben, bei deinen Selects nie Kreuzprodukte zu produzieren - da hast du nämlich normalerweise einen Fehler gemacht, es sei denn du weißt wirklich was du tust).
Und nein - ich kenne den richtigen auch gerade nicht :)

Ich würde es als Verknüpfungstabelle bezeichnen. Verknüpfungstabellen werden verwendet um 1:n oder n:n - Beziehungen darstellen zu können.

Beispiel: Du hast 2 Tabellen: Autoren und Artikel

Autor(ID,Name, Vorname)
Artikel(ID,Headline,Text)

Jetzt kriegst du die beiden Tabellen nicht schön zusammen, wenn du so was machen willst, wie du vorhattest (ein weiteres Feld mit mehreren Autoren durch Komma getrennt).
So etwas widerspricht auch den Normalformen.

Darum gibt es die Verknüpfungstabelle.
Diese enthält lediglich die ID's der zu verknüpfenden Datensätze plus etwaige Zusatzinformationen zur Verknüpfung, z.B.

Autor_id|Artikel_id|Aktion|zeit
1|1|erstellt|irgendwann
2|1|überarbietet|irgendwann später
1|1|gelöscht|nochmal später

Wobei die Aktion auch schon wieder etwas wäre, was man als Schlüsseltabelle auslagern würde.

Und über diese Verknüpfungstabelle kannst du nun ohne Probleme von Autor nach Artikel joinen - und alle Informationen entsprechend darstellen

Hoffe, das hilft dir weiter?
 
Zuletzt bearbeitet:
Danke für eure Erklärungen!

Nur so wie ihr es beschrieben habt, habe ich es auch derzeit. Nur war mir der Begriff "Kreuztabelle" bisher nicht untergekommen...

Um das ganze genauer zu erklären wo mein Problem ist...

PHP:
$abfrage2 = mysql_query("SELECT * usw. (habe ich rausgenommen)
FROM t_testberichte AS a 
LEFT JOIN t_heft AS b ON (a.heft_id = b.id)
LEFT JOIN t_redakteur AS d ON (d.id = a.red_id)
LEFT JOIN magazine_cover2 AS e ON (e.anzahl = a.heft_id AND e.jahr = a.jahr_id AND e.monat = a.nr)
WHERE a.anzahl='$id'
ORDER BY hname ");

und das ganze gebe ich dann mit einer billigen Schleife aus:

PHP:
while ($row2 = mysql_fetch_array($abfrage2))
{
Inhalt
}

Den Namen des Redakteures hole ich mir mittels LEFT JOIN, wie mache ich das jetzt wenn ich mehrere Autoren habe für einen Artikel? Ich könnte in der Schleife eine zusätzliche Abfrage per SELECT machen, nur das will ich nicht, kann man das nicht auf einmal in der einen großen Abfrage abwickeln?

Danke für eure Antworten.
 
Nur so wie ihr es beschrieben habt, habe ich es auch derzeit. Nur war mir der Begriff "Kreuztabelle" bisher nicht untergekommen...

Nein machst du nicht - gib's zu :)

SQL:
FROM t_testberichte AS a  
...
LEFT JOIN t_redakteur AS d ON (d.id = a.red_id)

Was sehen wir da?

Nun, du hast eine Tabelle testberichte. In der gibt es eine red_id.
Und diese red_id verweist direkt auf die Tabelle redakteur. So ist aber nur eine 1:1 -Beziehung abbildbar. Darum solltest du eine Verknüpfungstabelle verwenden.
 
Und wie soll das nun aussehen? Im Moment stehe ich jetzt ziemlich auf den Schlauch. Wie soll ich die 1:1 Beziehung ändern?

Wie immer danke im voraus.
 

Neue Beiträge

Zurück