Mam dwa stoły SQLite, przepisy i składniki. Muszę znaleźć wszystkie przepisy zawierające od 2 do 4 pozycji z listy składników, ale nie mogę pojąć SQL, aby to zadziałało.
Tabele to:
CREATE TABLE recipes (
rowidx INTEGER AUTOINCREMENT,
RecipeID TEXT(10) NOT NULL PRIMARY KEY,
Name TEXT(255) NOT NULL
);
CREATE TABLE Ingredients (
Recipe TEXT(10) NOT NULL PRIMARY KEY,
Ingredient TEXT(255) NOT NULL COLLATE NOCASE,
Measurement TEXT(255) NOT NULL
);
Zacząłem od czegoś prostego, ale zabrakło mi pary, kiedy doszedłem do części „między n i n składnikami”.
SELECT COUNT(*) FROM Recipes
WHERE RecipeID IN (
SELECT Recipe FROM Ingredients WHERE Ingredient IN (milk','butter','sugar','flour','egg' )
)
Jestem pewien, że musi być na to stosunkowo prosty sposób, ale nie jest to klikanie.
EDYTUJ: W rzeczywistości uzyskałem zmodyfikowaną wersję poniższej odpowiedzi:
SELECT *,ifnull((SELECT COUNT(i.Ingredient) AS IngredientCount FROM Recipes r LEFT JOIN Ingredients i ON r.RecipeID = i.Recipe WHERE i.Ingredient IN ('flour' ) and r.recipeid = allrecipes.recipeid GROUP BY R.RecipeID),0) AS IngredientCount
FROM Recipes allrecipes
WHERE IngredientCount BETWEEN 2 AND 4
W przeciwieństwie do oryginalnej odpowiedzi, jeśli przepis nie pasuje do żadnych składników, a podany jest BETWEEN 0 AND 2
, nie pojawi się on nawet na liście do sortowania, więc zostanie wykluczony.
3 odpowiedzi
SELECT
r.Name,
COUNT(i.Ingredient) AS Ingredients
FROM
recipes r
LEFT JOIN ingredients i
ON i.Recipe = r.RecipeID
AND i.Ingredient IN ('milk','butter','sugar','flour','egg')
GROUP BY r.Name
HAVING COUNT(i.Ingredient) BETWEEN 2 AND 4
SELECT r.* FROM Recipes r
JOIN Ingredients i
ON r.RecipeID = i.Recipe
WHERE i.Ingredient IN ('milk','butter','sugar','flour','egg')
GROUP BY r.RecipeID
HAVING COUNT(*) BETWEEN 2 AND 4
Po prostu kolejna odmiana tego samego:
SELECT R.*
FROM recipes AS R
WHERE EXISTS(
SELECT 0
FROM Ingredients AS I
WHERE I.Recipe = R.recipeID
AND I.Ingredient IN ('milk','butter','sugar','flour','egg')
GROUP BY I.Recipe
HAVING COUNT(I.Ingredient) BETWEEN 2 AND 4
)
Podobne pytania
Nowe pytania
sql
Structured Query Language (SQL) to język służący do wykonywania zapytań w bazach danych. Pytania powinny zawierać przykłady kodu, strukturę tabeli, przykładowe dane i znacznik używanej implementacji DBMS (np. MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 itp.). Jeśli Twoje pytanie dotyczy wyłącznie konkretnego DBMS (używa określonych rozszerzeń / funkcji), użyj zamiast tego tagu tego DBMS. Odpowiedzi na pytania oznaczone tagiem SQL powinny używać standardu SQL ISO / IEC.