Problem bei n:m Relation

rexy1337

Neuer Benutzer
Beiträge
3
Hallo zusammen,

ich habe ein Problem mit einer n:m Beziehung in einer Datenbank und komme nicht weiter.

Ich habe eine Tabelle Boards und eine Tabelle Posts, die mit einer n:m Beziehung (Tabelle BoardsPosts) verknuepft sind. Ein Post kann also zu meheren Boards gehoeren und ein Board kann mehrere Posts haben.

In der Oberflaesche soll der Benutzer die Moeglichkeit haben mehrere Boards zu selektieren. Dann sollen ihm alle Posts angezeigt werden die zu ALLEN (nicht nur zu einem) der Boards gehoeren.
Oder kurz gesagt: Ich brauche alle Post zu einer Teilmenge von Boards.

Wenn die Posts nur ein einem der gewaehlten Boards sein muessen, ist die Abfrage einfach. Aber wenn ich die Posts, die zu allen gewaehlten Boards gehoeren, haben moechte, komme ich nicht weiter. Vielleicht bin auch nur blind.

Ich hoffe hier kann mir einer helfen.

Vielen Dank

rexy1337
 
Werbung:
Einfach, wenn man eine passende Datenbank hat. Hier mal mit PostgreSQL.

Deine Tabelle board_posts mag enthalten:

Code:
test=# select * from board_posts;
b | p
---+---
1 | 1
2 | 1
3 | 1
2 | 2
4 | 2
4 | 5
(6 rows)

b ist FK zu board, p ist FK zu posts:

Code:
test=# \d board_posts;
  Table "public.board_posts"
Column |  Type  | Collation | Nullable | Default
--------+---------+-----------+----------+---------
b  | integer |  |  |
p  | integer |  |  |
Foreign-key constraints:
  "board_posts_b_fkey" FOREIGN KEY (b) REFERENCES boards(id)
  "board_posts_p_fkey" FOREIGN KEY (p) REFERENCES posts(id)

test=#

Folgende Abfrage liefert eine Übersicht, welcher post in welchem board ist, als Array aggregiert:

Code:
test=# select p, array_agg(b) from board_posts group by p;
p | array_agg
---+-----------
2 | {2,4}
5 | {4}
1 | {1,2,3}
(3 rows)

Nun brauchen wir nur noch HAVING, wir suchen nach posts, die in board 1,2 und 3 zugleich enthalten sind:

Code:
test=# select p, array_agg(b) from board_posts group by p having array_agg(b) @> array[1,2];
p | array_agg
---+-----------
1 | {1,2,3}
(1 row)

Also, nur post nummer 1 ist in allen 3 boards (1,2,3) enthalten.
 
Zuletzt bearbeitet:
Alternativ auch ohne PG:
Code:
SELECT post
  FROM (SELECT post,
               ROW_NUMBER () OVER (PARTITION BY board ORDER BY board) cnt
          FROM boardsposts
         WHERE  board IN(Liste der ausgewählten Boards)  )
WHERE cnt = Anzahl der ausgewählen Boards
 
Auch dir vielen Dank, aber das erste Beispiel war schon richtig, da PostgreSQL verwendet wird bzw. werden soll. Hatte ich vergessen zu erwaehnen. Mein Fehler.
 
Werbung:
Zurück
Oben