[MySQL] Verschachteltes Ergebnis bei SELECT erzeugen

Frezl

Erfahrenes Mitglied
Hallo allerseits,

ich versuche gerade eine SELECT-Abfrage zusammenzubauen, bei der sowohl aus einer Haupt-Tabelle als auch aus einer mit ihr verknüpften Tabelle Werte ausgelesen werden. Es handelt sich um eine n:m-Verknüpfung, die über eine Verknüpfungstabelle abgebildet wird. Das ganze sieht dann so aus:

Code:
items_persons_rel:
| items_id  | persons_id |

items:
| id  | name  | description | ...

persons:
| id  | name  | ...

Das Ergebnis soll neben einigen anderen Feldern zu jedem item alle verknüpften Personen enthalten. Das Ergebnis könnte dann z. B. so aussehen:

PHP:
$result = array (
    id => 2,
    name => Ein Item,
    description => Das kann das Item,
    related_persons => array (
        id => 4,
        name => Einfach Kurt
    )
);

Ich habe schlussendlich folgendes Konstrukt aus Joins zusammengestrickt:
Code:
SELECT
`items`.`id` as `id`,
`items`.`name`,
`persons`.`id` as `persons_id`,
`persons`.`first_name`
FROM
`items`
LEFT JOIN
`items_persons_rel`
ON
`items_persons_rel`.`items_id` = `items`.`id`
LEFT JOIN
`persons`
ON
`persons`.`id` = `items_persons_rel`.`persons_id`
ORDER BY
`items`.`id`
DESC
Das liefert mir im Prinzip auch die Informationen, die ich haben will, allerdings nicht in de gewünschten verschachtelten Struktur. Stattdessen wird für jede Person, mit der das Item verknüpft ist, eine neue Zeile angelegt. Also so:
Code:
Array
(
[0] => Array
(
[id] => 61
[name] => No relations
[description] => dieses und jenes
[persons_id] =>
[name] =>
)

[1] => Array
(
[id] => 56
[name] => Testbeitrag mit 2 related persons
[description] => Etwas anderes
[persons_id] => 1
[first_name] => Martin
)

[2] => Array
(
[id] => 56
[name] => Testbeitrag mit 2 related persons
[description] => Etwas anderes
[persons_id] => 4
[name] => Max
)

)

Ist es überhaupt möglich, mit mySQL verschachtelte Ergebnisse zu erzeugen? Wenn nicht, wie würdet ihr Das Ergebnis bearbeiten, um die gewünschte Struktur zu erreichen. Das ganze sollte möglichst performant bleiben, deshalb will ich Array-Durchläufe mit Schleifen wenn möglich verhindern....

Viele Grüße
Frezl

EDIT:
Das Hinzufügen von
Code:
GROUP BY
`items`.`id`
führt dazu, dass die Items nicht mehr mehrfach auftauchen. Leider wird dann aber nur noch eine Person zu jedem Item ausgegeben. Also auch nicht das, was ich suche :-/
 
Zuletzt bearbeitet:
ist es überhaupt möglich, mit mySQL verschachtelte Ergebnisse zu erzeugen?
Nein. SQL Liefert immer ganze Zeilen. Wenn du nachher verschachteln willst, dann musst du das Programmseitig lösen

Variante 1:
Du gehst mit einem Loop über die Haubttabelle und liest jeweils die passenden Details aus

Variante 2:
Du nimmst den JOIN den du hast. Iterierst über ihn und findest mit einer Programmlogik heraus, wo das neue item beginnt
 
Hey Yaslaw,

vielen Dank für deine Antwort. Was am Ende dabei rauskommen soll ist eine Liste von Items, wobei zu jedem Item Links zu den Detailseiten der jeweils verknüpften Personen gezeigt werden soll. Ich habe daher recherchiert, ob das mit CONCAT möglich ist und bin auf folgendes exzellentes Tutorial gestoßen: http://www.mysqlperformanceblog.com/2013/10/22/the-power-of-mysqls-group_concat/

Genau das, was ich gesucht habe :) Problem gelöst.

Viele Grüße
Frezl
 
Zurück