susi: m:n-verknüpfung in einem datensatz?

hallo,

ich habe nun eine etwas komisch anmutende frage jedoch villeicht bin ich doch nicht so firm mit SQL und es gibt eine möglichkeit!

ich habe eine m:n verbidung ...

table: artikel
id, title, text, time ...
 table: genres
id, name
 table: artikel_genres_mn
foreign_id, local_id

nun sind eben die artikel mit den genres per m:n verbunden!
also der artikel mit dem titel "box1" ist nun mit dem genre "rock, pop, electro" verbunden!

SELECT * FROM artikel a LEFT JOIN artikel_genres_mn m ON a.id=m.local_id INNER JOIN genres ON genres.id=foreign.id

dies funktioniert ja auch gut und so wie es sollte ...
jedoch falls ich nun alle artikel (2000) wobei bei manchen bis zu 4 genres zugefügt sind per select abfrage bekomme ich redudante 6000 datensätze zurück! was vollends natürlich ist ...

nun meine frage ...

gibt es eine möglichkeit diese m:n verknüpfungen in einem datensatz zurück zu bekommen?

also ein "join" der mit "box1", (genres), 1, 3, 25 zurück gibt ein einer row und nicht in dem beispiel in 3 rows "box1", 1 und "box1", 3 und "box1" 25?

komische frage wenn ich darüber nachdenke dennoch ... muss raus ...

bussi susi

  1. yo,

    SELECT * FROM artikel a LEFT JOIN artikel_genres_mn m ON a.id=m.local_id INNER JOIN genres ON genres.id=foreign.id

    diese art der abfrage macht schon mal keinen sinn. entweder du machst den LEFT JOIN (OUTER JOIN) konsequent, also auch im zeiten join, anstelle des INNER joins oder aber aber du machst gleich alles INNER joins.

    jedoch falls ich nun alle artikel (2000) wobei bei manchen bis zu 4 genres zugefügt sind per select abfrage bekomme ich redudante 6000 datensätze zurück! was vollends natürlich ist ...

    das sind eben keine redundanten datensätze, sondern unterschiedliche

    gibt es eine möglichkeit diese m:n verknüpfungen in einem datensatz zurück zu bekommen?

    dazu müssten wir dein dbms und deine version kennen. ich tippe mal auf mysql. ich vermute des weiteren, du willst nur den artikelnname uasgeben und die verschiedenen genres in einer spalte zusammenfügen. dann ist GROUP_CONCTAT dein freund, eine ggregat-funktion, die es so nur bei mysql gibt.

    Ilja

    1. danke ich werd mich mal in GROUP_CONCTAT einlesen!

      yo,

      SELECT * FROM artikel a LEFT JOIN artikel_genres_mn m ON a.id=m.local_id INNER JOIN genres ON genres.id=foreign.id

      diese art der abfrage macht schon mal keinen sinn. entweder du machst den LEFT JOIN (OUTER JOIN) konsequent, also auch im zeiten join, anstelle des INNER joins oder aber aber du machst gleich alles INNER joins.

      jedoch falls ich nun alle artikel (2000) wobei bei manchen bis zu 4 genres zugefügt sind per select abfrage bekomme ich redudante 6000 datensätze zurück! was vollends natürlich ist ...

      das sind eben keine redundanten datensätze, sondern unterschiedliche

      gibt es eine möglichkeit diese m:n verknüpfungen in einem datensatz zurück zu bekommen?

      dazu müssten wir dein dbms und deine version kennen. ich tippe mal auf mysql. ich vermute des weiteren, du willst nur den artikelnname uasgeben und die verschiedenen genres in einer spalte zusammenfügen. dann ist GROUP_CONCTAT dein freund, eine ggregat-funktion, die es so nur bei mysql gibt.

      Ilja

    2. prima genau das wars group_concat! super gut!!!