MSSQL - inner join + group by

Hi ich habe eine Recipes Tabelle die via. Link Tabelle (n:n) mit der Ingredients Tabelle verlinkt ist.

Bei der Suche möchte ich jedoch alle Rezepte finden die den Begriff im Namen des Rezepts oder im Namen einer der Zutaten haben.

Mein Versuch:
Code:
SELECT
    Recipes.id, Recipes.name, Recipes.short_description, Recipes.long_description
FROM
    Recipes
INNER JOIN
    Recipe_Ingredient_Link ON Recipe_Ingredient_Link.recipe_id = Recipes.id
INNER JOIN
    Ingredients ON Ingredients.id = Recipe_Ingredient_Link.ingredient_id
WHERE 
  Recipes.name LIKE '%search%' OR
  Ingredients.name LIKE '%search%'
GROUP BY Recipes.id
;

Fehler:
Code:
Column 'Recipes.name' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

GROUP BY nach Recipes.name geht nicht weil es Rezepte mit selben Namen geben kann.

Jeder Tipp ist willkommen :)
 
Für eine Grouppierung wird eine Aggregatfunktion benötigt!
(Sum(), Count(), Avg(), ...)
 
schmeiß das group by raus ...

ich denke mal du willst damit erreichen, dass rezepte nicht doppelt auftauchen ... dafür gibt es SELECT DISTINCT
 
SELECT DISTINCT will auch nicht so ganz:

Code:
SELECT DISTINCT 
    Recipes.id, Recipes.name, Recipes.short_description, Recipes.long_description
FROM 
    Recipes
INNER JOIN 
    Recipe_Ingredient_Link ON Recipe_Ingredient_Link.recipe_id = Recipes.id
INNER JOIN 
    Ingredients ON Ingredients.id = Recipe_Ingredient_Link.ingredient_id
;

-->
Code:
The text data type cannot be selected as DISTINCT because it is not comparable.

Nur die Id DISTINCT zu selecten würde zwar gehen dann müsste ich zum anzeigen aber pro ergebnis 1nen query abfeuern der via. Id die Daten holt.


// Edit

Das hier funktioniert ich frage mich nur ob dass auch "best practice" für solche queries ist...
Code:
SELECT 
	Recipes.id, Recipes.name, Recipes.short_description, Recipes.long_description
FROM Recipes
WHERE
	Recipes.Id IN (
		SELECT DISTINCT Recipes.Id FROM
			Recipes
		INNER JOIN 
			Recipe_Ingredient_Link ON Recipe_Ingredient_Link.recipe_id = Recipes.id
		INNER JOIN 
			Ingredients ON Ingredients.id = Recipe_Ingredient_Link.ingredient_id
		WHERE
			Recipes.name LIKE '%test%' OR
			Ingredients.name LIKE '%test%'
	)
;
 
Zuletzt bearbeitet:
du machst einen unnötigen join ...

der join zwischen Reciepes und Recipe_Ingredient_Link ist nicht notwendig, da du in Recipe_Ingredient_Link bereits die id hast, die du suchst ... du könntest also den suchvorgang an dieser stelle in 2 teile teilen, und der suche in Reciepes ein UNION DISTINCT SELECT mit der suche in den Zutaten hinterher schieben ... aber es darf bezweifelt werden, dass das bei kleinen tabellen einen messbaren unterschied macht ...
 
Zurück
Oben