mysql - join mit order by

südpol

Erfahrenes Mitglied
Hi,

sorry für den komisch Betreff - ich konnte es leider nicht so kurz beschreiben :)

Ich habe ein kleines join - Problem und bin mir nicht sicher ob man das mit mysql umsetzen kann.

(stark vereinfach)
Es gibt bei mir 3 Tabellen.
Die erste enthält Fragen und hat z. B. die Felder q_id und frage
Die zweite Tabelle enthält antworten z. B. a_id und antwort
die dritte Tabelle enthält die Beziehung der Tabelle eins zu zwei also a_id und q_id

Beziehung einer Frage den Antworten kann somit 1:n sein (ja, das muss leider so sein 1:1 wäre ja einfach...)

Ich würde nun gerne in einem query alle Datensätze abfragen. Sprich die Frage + alle zugeordneten Antworten. Geht das?

Derzeit habe ich es so gemacht (sehr unschön)

Abfrage aller Fragen - while schleife durch die Fragen - innerhalb der Schleife einen weiteren query, der mir die Antworten aus der db sucht.
-> Das ist leider etwas zu anstrengend für den Server (es gibt u. U. ca. 500 Fragen pro Seite sprich alleien für diesen Teil 500 queries...).

Bin für jeden Lösungsansatz dankbar!

Gruß
 
Auuuuu! Wie kann man eine Datenbank nur so vergewaltigen!?...:sad:

Ich hoffe, ich verstehe Dich korrekt:
Du hast eine Anzahl von Fragen, der jeweils keine, eine oder mehrere Fragen zugeordnet sind, wobei aber jede Antwort eindeutig zu einer Frage gehört (1:n-Beziehung)
Da benötigst du keine Relationentabelle - die brauchst du nur bei m:n (Also wenn die Antworten auch zu mehreren Fragen gehören).

Bei Deiner Problemstellung müsste das DB-Design etwa so aussehen:

Fragen
----------
Frage_ID
Frage


Antworten
--------------
Antwort_ID
Antwort
Frage_ID (als Fremdschlüssel)


Die passende SQL-Abfrage wäre dann:
PHP:
SELECT f.Frage_ID, f.Frage, a.Antwort_ID, a.Antwort 
FROM Fragen f 
INNER JOIN Antworten 
ON f.Frage_ID=a.Frage_ID
Oder in Kurzschreibweise:
PHP:
SELECT f.Frage_ID, f.Frage, a.Antwort_ID, a.Antwort 
FROM Fragen f, Antworten 
WHERE f.Frage_ID=a.Frage_ID

Bei Deiner Lösung (n:n) wäre es dann so:
PHP:
SELECT f.Frage_ID, f.Frage, a.Antwort_ID, a.Antwort 
FROM Fragen f 
INNER JOIN Beziehung b 
ON f.Frage_ID=b.Frage_ID 
INNER JOIN Antworten b 
ON b.Antwort_ID=a.Antwort_ID
 
Gorcky hat gesagt.:
Auuuuu! Wie kann man eine Datenbank nur so vergewaltigen!?...:sad:
Wieso :rolleyes: Dafür ist die db doch da :D
Ich hoffe, ich verstehe Dich korrekt:
Du hast eine Anzahl von Fragen, der jeweils keine, eine oder mehrere Fragen zugeordnet sind, wobei aber jede Antwort eindeutig zu einer Frage gehört (1:n-Beziehung)
Da benötigst du keine Relationentabelle - die brauchst du nur bei m:n (Also wenn die Antworten auch zu mehreren Fragen gehören).
ok, da hast du recht. Ich wollte das db - Design aber in diese Richtung offen lassen. (hätte ich vielleicht erwähnen können...) :)
Bei Deiner Problemstellung müsste das DB-Design etwa so aussehen:

Fragen
----------
Frage_ID
Frage


Antworten
--------------
Antwort_ID
Antwort
Frage_ID (als Fremdschlüssel)


Die passende SQL-Abfrage wäre dann:
PHP:
SELECT f.Frage_ID, f.Frage, a.Antwort_ID, a.Antwort 
FROM Fragen f 
INNER JOIN Antworten 
ON f.Frage_ID=a.Frage_ID
Oder in Kurzschreibweise:
PHP:
SELECT f.Frage_ID, f.Frage, a.Antwort_ID, a.Antwort 
FROM Fragen f, Antworten 
WHERE f.Frage_ID=a.Frage_ID
Bei Deiner Lösung (n:n) wäre es dann so:
PHP:
SELECT f.Frage_ID, f.Frage, a.Antwort_ID, a.Antwort 
FROM Fragen f 
INNER JOIN Beziehung b 
ON f.Frage_ID=b.Frage_ID 
INNER JOIN Antworten b 
ON b.Antwort_ID=a.Antwort_ID

ok die Lösung werde ich mal versuchen in mein System einzubauen. Wie kann ich mir das Ergebnis dann vorstellen? Bekomme ich eine Frage und dazu ein array mit Antworten?

| question_id | answer_ids |
| 1 | 1,2,3 |
| 2 | 4, 5 |

Auf jeden Fall schon mal danke für deine Antwort!
 
Original geschrieben von südpol
Wie kann ich mir das Ergebnis dann vorstellen? Bekomme ich eine Frage und dazu ein array mit Antworten?

| question_id | answer_ids |
| 1 | 1,2,3 |
| 2 | 4, 5 |
Ja, fast.
So sollte es aussehen:

Code:
f.Frage_ID  ,  f.Frage  ,   a.Antwort_ID  ,   a.Antwort 
1                 häh?           1                   ja
1                 häh?           2                  vielleicht
2                 warum?     1                  ja
3                 wieso?          3                nein
3                 wieso?       4                  gar nicht
3                 wieso?       5                  och nö

Wenn du nur die Antworten zu einer Frage haben willst kannst du das ja mit WHERE sagen.
 
Zuletzt bearbeitet:
hmm ok stimmt so hatte ich das auch schon mal :rolleyes: Da muss ich dann über das Skript noch mal prüfen ob die ID der nun kommenden Frage schon mal vorhanden ist und dann die Antwort der soeben gegebenen Antwort anhängen. -> das wollte ich vermeiden :-( Ich schreib das ganze direkt in ein excel sheet raus und müsste so den Aufruf der excel klasse nachstellen - das würde das Skript deutlich komplexer werden lassen - hmm mal sehen ob ich das über ne weitere klasse lösen kann.

Dank die für die Antwort. Scheint wohl nicht so darstellbar zu sein wie ich mir das vorgestellt habe. Naja auch gut dann war wenigstens mein 4 Gedanke schon der Richtige *g*

Gruß
 
Zurück