Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

mysql Abfrage mit Left JOIN

Empfohlene Antworten

Veröffentlicht

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)????

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!

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 :-(

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

ok, alles klar.

Danke!

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.