SQL MySQL Beziehungen / JOIN / Foreign Keys

Lv99de

Newbie
Registriert
Juli 2011
Beiträge
7
Hallo,
ich bin mal wieder mit einem kleinem Projekt aktiv... ;-)

Frage 1.:
Ich habe 2 Tabellen, und möchte das bei der Anzeige von der Tabelle "0000", aus der Tabelle "0001" Wert1 ergänzt wird...
Der ForeignKey in "0000" bezieht sich auf "0001"s PrimaryDB2.

Code:
___0000____________________            ___0001___________
PrimaryDB1 | x | ForeignKey            PrimaryDB2 | Wert1
Bisher sieht mein Code so aus:
Code:
$result = mysql_query("SELECT `0000`.*, `0001`.* 
                       FROM `0000`
		        LEFT JOIN `0000` ON `0000`.ForeignKey = `0001`.PrimaryDB2");
Also gewünscht wird die Anzeige:
PHP:
<?php while ($row = mysql_fetch_assoc($result)) { ?>
  <tr>
   <td>
 <?php echo $row["PrimaryDB1"]; ?>
   </td>
   <td>
 <?php echo $row["x"]; ?>
   </td>
   <td>
 <?php echo $row["PrimaryDB2"]; ?>
   </td>
   <td>
 <?php echo $row["Wert1"]; ?>
   </td>
  </tr>  
<?php } ?>
Wie muss ich dafür den Code oben abändern, oder gibt es da eine anderen Lösung?
Event. ohne Foreign keys?

Und Frage 2.:
Vermutlich sind das bald 3 oder 4 Tabellen.
Ich habe das mal modelliert mit der MySQL-Workbench:
Unbenannt-180x136.jpg

In groß: http://lv99.de/?attachment_id=1855
Ich hab die Foreign Keys (die Linien) einfach nach folgender Regel geordnet:
1projects
2baum
3contacts
4events
Wenn Foreign Key mit niedriger 1projects dann wird Foreign Key bei projects abgelegt
Wenn Foreign Key mit niedriger 2baum dann wird Foreign Key bei baum abgelegt
Wenn Foreign Key mit niedriger 3contacts dann wird Foreign Key bei projects abgelegt
Wenn Foreign Key mit niedriger 4events dann wird FKey bei events abgelegt

Das ... ähm ... klingt etwas seltsam. Ist es auch - Habt ihr eine besser Lösung Idee?
Wäre echt dankbar. ;-)

Wenn euch ein Teil der Fragen verwirrt ... ich versuche gerne nochmal meine Probleme zu skizzieren.

Vielen Dank im voraus!

Mit besten Grüßen
 
Zuletzt bearbeitet von einem Moderator: (... *Rechtschreibung)
zu Frage1)
Wenn ich dich richtig verstanden habe, müsstest du einfach bei der Anzeige ein
update 0001 set wert1 = X where ID = ...
worauf der Wert gesetzt werden soll.

zu Frage2)
Möglichkeit 1)
Dort könntest du einen Datenbank Trigger benutzen

Möglichkeit 2)
Beim Inserten wird dieser Wert abgefragt und du machst eine switch bzw. else if abfrage und insertest die Werte selber in die entsprechenden Tabellen.
 
1)
Wieso Left Join? Wenn es Foreign Key ist dann MUSST du INNER JOIN machen. Left Join liefert die auf der linke Seite (in der From Tabelle) NULLs falls die IDs nicht übereinstimmen? Ähm ja left join '0000' => muss das nicht '0001' sein?
Wenn du ergänzen willst, mach doch einen Insert Into From Table (wenn mysql das kann), dann muss du keine zusätzliche Anfragen oder cursors schreiben.

2)
Alle vernünftige DB Tabellen sollen ohne Überkreuzung der Abhängigkeit erstellt werden. Es ist übersichtlicher und du wirst auch sehen, je mehr Abhängigkeiten sich überkreuzen desto schwieriger wird es die Daten konsistent zu halten.

3)
Ist es sicher keine Hausaufgabe? :D
 
Hallo,
es ist ganz sicher keine Hausaufgabe, ich habe gerade Ferien.
Danke für die Antworten, ich gehe die erstmal in Ruhe durch und melde mich dann nochmal.

Mit besten Grüßen

Edit 1:

@roker002

1) INNER JOIN:
Ich möchte aber, dass die ursprünglichen Daten auch angezeigt werden, wenn dem Foreign Key nichts zugewiesen ist, d.h. = NULL ist.
... denk: Das könnte man aber auch dadurch darstellen, dass ich der primary id 0 in der zweiten Tabelle den Wert "Keine Beziehung" zuweise...
- Fazit: OK, ich probiere das mal aus...

2) "vernünftige DB Tabellen"
Ja, prinzipiell schon. Mein ganzes Projekt beruht allerdings auf Relationen, erst durch die Verknüpfungen wird es zu etwas, dass sinnvoll ist und noch nicht wie Sand am Meer gibt.

@Metzlor

1) OK... ähm ich weiß nicht genau wie ich das bei zwei Tabellen machen soll?
Kannst du dein Beispiel eventl. etwas erweitern?

2) Gooooooooogle Trigger...


Edit 2:
Ich habe die Tabelle angepasst...

0000 = 0000_contacts
0001 = 0000_projects

1. Tabelle
0000_contacts (0000)
Code:
PrimaryDB1 | x | ForeignKey
    0     | y | 1
    1     | d | 3
    2     | c | 0
    3     | y | 2

2. Tabelle
0000_projects (0001)
Code:
PrimaryDB2 | Wert1
    0     | alpha
    1     | gamma
    2     | beta
    3     | delta


Gewünscht wird die Anzeige:
PHP:
<?php while ($row = mysql_fetch_assoc($result)) { ?>
  <tr>
   <td>
 <?php echo $row["PrimaryDB1"]; ?>
   </td>
   <td>
 <?php echo $row["x"]; ?>
   </td>
   <td>
 <?php echo $row["ForeignKey"]; ?>
   </td>
   <td>
 <?php echo $row["PrimaryDB2"]; ?>
   </td>
   <td>
 <?php echo $row["Wert1"]; ?>
   </td>
  </tr>  
<?php } ?>

d.h.
HTML:
0 | y | 1 - 1 | gamma
1 | d | 3 - 3 | delta
2 | c | 0 - 0 | alpha
3 | y | 2 - 2 | beta
...

Mit besten Grüßen
Lv99de
Ergänzung ()

Juhu! Es funtioniert!
Also die Lösung für die Frage 1.:
PHP:
$result = mysql_query("
SELECT *
FROM `0000_contacts` 
LEFT JOIN `0000_projects` 
ON `0000_contacts`.projects = `0000_projects`.pidprojects");

Irgendwie nichts besonders. Aber es geht! =)

@roker002
1)
- a. Nein, LEFT JOIN war schon richtig. INNER JOIN muss nicht zwingend angewandt werden. Ich definiere die Anzeige im nachhinein über PHP.
- b. Zu "Insert Into From Table". Da konnte mir Dr. Google nicht sagen, ob es das bei MySQL gibt.

@Metzlor
"Trigger": Da lese ich mich gerade ein.
Möglicherweise ordne ich auch jeder Tabelle einfach Foreign Keys zu...
"Jeder mit jedem"
Das würde meine MySQL-Abfragen standardisieren vereinfachen, allerdings müsste ich dann auch jedes mal bei INSERT das einbauen und es würde die Datenbank vergrößern...

By the way:
Kann man mehrere IDs in eine Foreign Key Spalte schreiben?

Mit besten Grüßen
Lv99de
 
Zuletzt bearbeitet: (erweitert)
@Metzlor
Mir geht es nicht ums PHP, sondern um die dDB Strucktur.
Und Trigger sind da noch unordentlicher als meine Lösung.
 
Zurück
Oben