Problem mit SQL-Query

Mordor

Registered User
Mahlzeit alles zusammen

Ich bin seit Tagen auf der Suche nach einer Möglichkeit aus drei Tabellen mit einer Query Daten rauszubekommen. Das Problem hierbei ist, dass in einer Tabelle mehrere Datensätze drin stehen, die auf einer anderen Tabelle referenizeirt sind. Hier mal der Aufbau der Tabellen:

Tabelle 1:
+----+---------------+
| id | title |
+----+---------------+
| 1 | worktypes |
| 2 | Firma |
| 3 | neues projekt |
+----+---------------+

Tabelle 2:
+----+-----------------------+-----+
| id | title | ref |
+----+-----------------------+-----+
| 1 | arbeit 1 | 1 |
| 2 | arbeit 2 | 1 |
| 3 | arbeit 3 | 1 |
| 4 | Projekt 1 | 2 |
| 5 | Projekt 2 | 2 |
| 6 | Projekt 3 | 2 |
| 7 | projekt 4 | 2 |
| 8 | Projekt 5 | 3 |
| 9 | veranstaltung 3 | 3 |
| 10 | veranstaltung 2 | 3 |
| 11 | veranstaltung | 3 |
+----+-----------------------+-----+

Tabelle 3:
+----+----------+-----------+-----------+---------+
| id | title | work_id | comp_id | pro_id |
+----+----------+-----------+-----------+----------+
| 1 |content 1| 1 | 5 | 10 |
| 2 |content 2| 3 | 7 | 9 |
| 3 |content 3| 1 | 8 | 10 |
+-----+---------+------------+-----------+----------+

Die Tabellen sind folgendermaasen verknüpft:
tabelle1.refid = tabelle2.ref
Bei Tabelle 3 wird das schon wieder komplizierter hier gibt es nämlich drei Referenzfelder, je nachdem um was es sich handelt:
tabelle2.id = tabelle3.work_id (wenn tabelle2.ref = tabelle1.id=1)
tabelle2.id = tabelle3.comp_id (wenn tabelle2.ref = tabelle1.id=2)
tabelle3.id = tabelle3.pro_id (wenn tabelle2.ref = tabellen1.id=3)

ich suche jetzt nach einem SELECT, der es mir ermöglicht so abzufragen, dass wenn ich tabelle3 abfrage, dass mir dann anstatt von work_id, comp_id, und pro_id die namen aus Tabelle2 ausgegeben werden. Das ganze sollte dann in etwar so aussehen:

±----+---------+-----------------+------------+---------------------+
| id | title | worktype | Firma | neues Projekt |
+-----+--------+-----------------+-------------+--------------------+
| 1 |content1| arbeit 1 | Projekt 2 | veranstaltung 2 |
| 2 |content2| arbeit 3 | projekt 4 | veranstaltung 3 |
| 3 |content3| arbeit 1 | projekt 4 | veranstaltung 2 |
+----+---------+-----------------+------------+---------------------+

Vielleicht kann mir jemand helfen. Vielleicht ist so eine Abfrage auch nicht möglich. Ich möchte es halt mit so wenig wie möglichen Abfragen machen, um es icht in PHP lösen zu müssen.

Kurz zum System:
Mysql 5.0 (aus den Debian Paketen)
PHP 5.2.6 (aus den Debian Paketen)

Gruß Mordor
 
So, ich glaube ich konnte das jetzt doch alleine lösen. Die Frage ist nur, ob das eine vernünftige Möglichkeit ist. Vielleicht kann da ja jemand mal einen Kommentar dazu abgeben. Hier mal mein Ergebnis:

Code:
SELECT con.id AS id, con.title AS title, cat1.title AS worktype, cat2.title AS firma, cat3.title AS projekt 
FROM 
tabelle1 AS con LEFT JOIN tabelle2 AS cat1 ON con.work_id = cat.id
LEFT JOIN tabelle2 AS cat2 ON con.comp_id = cat2.id 
LEFT JOIN tabelle2 AS cat3 ON con.pro_id = cat3.id

Zumindest macht das ganze schon mal das, was ich auch haben will. Wie schon geschrieben ist jetzt nur die Frage, ob das die feine englische Art ist, oder ob ich damit irgendwann Probleme bekommen würde.

Gruß Mordor
 
Das passt schon. Sollte keine Probleme geben, selbst wenn du in tabelle2 oder 3 keinen passenden Einträge hast, werden die Daten aus 1 dargestellt. Deswegen ja left join. Willst du das verhindern, sprich willst du nur daten wo alles gefüllt ist, dann musst du "INNER JOIN" nehmen.
 
Danke für die Hilfe.

Es sollte nicht möglich sein, dass einmal keine Daten für einen Punkt vorhanden sind, da das die Eingabe über PHP nicht zulässt. Aber gut zu wissen. Irgendwie sind die JOINS manchmal noch bömische Dörfer.
 
Back
Top