[MySQL] Mal wieder die guten alten JOINS

WhiZZler

Chancentod²
ID: 85586
L
6 Mai 2006
588
32
hi

bastle gerade an einem etwas größeren query und komme nicht mehr wirklich weiter.. es geht um eine seite mit cocktailrezepten

erstmal die tabellenstruktur.. (vereinfacht)

recipes: (die rezepte
name | description | recipe_id

ing2rec: (verbindungstabelle zwischen zutaten und rezepten)
ing_id | recipe_id

ingredients: (tabelle in der die zutaten gespeichert sind)
ing_name | ing_id

comments: (hier sind kommentare zu den einzelnen rezepten gespeichert)
comment | recipe_id | comment_id

so weit, so gut..
bis jetzt hatte ich auf der übersichtsseite über die cocktails den cocktailnamen mit den dazugehörigen zutaten ausgelesen.. hat alles wunderbar funktioniert..
hier der query:

Code:
SELECT r.name, ir.recipe_id, 
GROUP_CONCAT( CONCAT_WS( ' ', ir.amount, ir.unit, i.ing_name ) ) AS ings
FROM cf_ing2rec ir
LEFT JOIN cf_recipes r ON ( r.recipe_id = ir.recipe_id )
LEFT JOIN cf_ingredients i ON ( i.ing_id = ir.ing_id )
WHERE r.cat_id = 9
GROUP BY r.recipe_id
ORDER BY r.recipe_id

jetzt wollte ich auf der übersichtsseite noch die anzahl der kommentare zum jeweiligen cocktail auslesen lassen.. da bin ich jetzt mit meinem latein am ende..
ich hatte es folgendermaßen versucht:
Code:
SELECT r.name, ir.recipe_id, 
GROUP_CONCAT( CONCAT_WS( ' ', ir.amount, ir.unit, i.ing_name ) ) AS ings,
[b]COUNT( c.comment_id ) AS num_comments[/b]
FROM cf_ing2rec ir
LEFT JOIN cf_recipes r ON ( r.recipe_id = ir.recipe_id )
LEFT JOIN cf_ingredients i ON ( i.ing_id = ir.ing_id )
[b]LEFT JOIN cf_comments c ON ( r.recipe_id = c.recipe_id )[/b]
WHERE r.cat_id =9
GROUP BY r.recipe_id
ORDER BY r.recipe_id

hier ergaben sich jetzt zwei problem:
  • wenn zu einem rezept 2 kommentare und 8 zutaten vorhanden sind, dann erzählt mir diese abfrage, dass insgesamt 16 (also pro zutat 2) kommentare vorhanden sind.. das konnte ich noch recht einfach lösen, indem ich durch die anzahl der zutaten teile..
  • wenn zwei kommentare vorhanden sind, dann erhalte ich auf diese art und weise jede zutat 2 mal.. und das ist dann doch recht unschön..

wie könnte man das lösen? um die datenbank zu schonen will ich auf keinen fall für jedes ausgelesene rezept nochmals mit einem extra query die anzahl der kommentare auslesen..

danke im vorraus
mfg
whizzler
 
PHP:
GROUP_CONCAT(DISTINCT ...
COUNT(DISTINCT...


*edit* wasn das für nen scheiß forum... wenn ich was groß schreibe dann soll das am ende auch groß bleiben *grrr*