Zum Inhalt springen

mysql Abfrage mit Left JOIN


oneside

Empfohlene Beiträge

Hallo Leute,

ich habe zwei MYSQL-Tabellen:

Questions

Feld: QuestionID

Feld: QuestionName

QuestionOptions

Feld: OptionID

Feld: OptionQuestionID

Feld: OptionName

Es gibt immer einen Datensatz in der Tabelle "Questions" und einen, keinen oder auch mehrere mögliche Optionen in der Tabelle "QuestionOptions".

Verknüpft sind die Sätze über:

Questions: QuestionID

und

QuestionOptions: OptionQuestionID

Ich möchte jetzt per LEFT JOIN eine Abfrage machen, jeder Datensatz aus der Tabelle "Question" und alle dazugehörigen Datensätze der Tabelle "QuestionOptions" gleich darunter (nachfolgend im Array) bekomme.

Also Jeden "Question" Datensatz einmal und nachfolgend im Array die dazugehörigen "QuestionOptions" (je nach vorhandener Anzahl):


array(2)
QUESTION => Array (2)
QuestionID = 1
QuestionName = Augenfarbe
QUESTIONOPTIONS = Array(3)
Array(2)
OptionID = 1
OptionName = Grün
Array(2)
OptionID = 2
OptionName = Braun
Array(2)
OptionID = 3
OptionName = Blau
QUESTION => Array (2)
QuestionID = 2
QuestionName = Haarfarbe
QUESTIONOPTIONS = Array(2)
Array(2)
OptionID = 4
OptionName = Blond
Array(2)
OptionID = 5
OptionName = Braun
[/PHP]

Jetzt habe ich das mit folgender Abfrage probiert:

[PHP]
$query = "SELECT * FROM Questions
LEFT JOIN QuestionOptions
ON Questions.QuestionID=QuestionOptions.OptionQuestionID";

Dann bekomme ich aber für jeden Satz in den QuestionOptions auch die Daten der Questions dazu, was dann so aussehen würde:


array(5)
QUESTION => Array (4)
QuestionID = 1
QuestionName = Augenfarbe
OptionID = 1
OptionName = Grün
QUESTION => Array (4)
QuestionID = 1
QuestionName = Augenfarbe
OptionID = 2
OptionName = Braun
QUESTION => Array (4)
QuestionID = 1
QuestionName = Augenfarbe
OptionID = 3
OptionName = Blau


QUESTION => Array (4)
QuestionID = 2
QuestionName = Haarfarbe
OptionID = 4
OptionName = Blond
QUESTION => Array (4)
QuestionID = 2
QuestionName = Haarfarbe
OptionID = 5
OptionName = Braun
[/PHP]

Wie bekomme ich es so hin, dass die Abfrage mir den Datensatz aus der Tabelle "Questions" nur einmal und darunter mit einem neuen Array-Key alle zugehörigen Datensätze aus der Tabelle "QuestionOptions" zurückliefert (Also wie beim 1.ten Beispiel)????

Link zu diesem Kommentar
Auf anderen Seiten teilen

Einfach über PHP den Gruppenwechsel, bzw, wechsel der Question-ID auslesen und schon hast du eine Möglichkeit zur Unterscheidung, mit SQL alleine wirst du das nicht hinbekommen. Du mußt das ResultSet einmal nachbereiten um dir dein gewünschtes Array so vorzulegen, wie du es brauchst!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wie das geht nicht direkt bei der Abfrage?

Kann man nicht irgendwie sagen


$query = "SELECT * FROM Questions
LEFT JOIN QuestionOptions
ON Questions.QuestionID=QuestionOptions.OptionQuestionID
QuestionOptions GROUP BY Options";
[/PHP]

oder sowas?

Wenn das nicht geht, bekomme ich ja andauernd zig Daten aus der Datenbank in mein Array, die eigentlich redundant sind, da ich diese nur einmal benötige :-(

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du willst wenn ich dich richtig verstanden habe, mit deiner SQL-Abfrage als ResultSet gleich ein zweidimensionales Array erhalten, oder? Das geht nicht!

Wenn du deinen GroupBy auf die QuestionID legst wirst du logischerweise immer nur einen Datensatz pro Question bekommen, legst du das GroupBy auf die OptionID wirst du genau das selbe Ergebnis erhalten, wie du es bereits vorliegen hast. Du musst in der späteren Verarbeitung des Resultsets erst die Unterscheidung vornehmen, oder die Daten einfach in ein assoziatives Array schieben und das bei jedem Satz.

[B]Pseudocode[/B]

Schleife über das Resulstset

  resArray[QuestionID][Frage] = QuestionFrage;

  resArray[QuestionID][Erläuterung] = QuestionErläuterung;

  ...

  tmpOption[Name] = OptionName;

  tmpOption[VALUE] = OptionVALUE;

  ...

  array_push(resArray[QuestionID][Options],option)

Ende Schleife

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...