2011-01-05 4 views
0

Кажется, что это было бы просто, но по некоторым причинам я не могу получить это делать то, что я хочу ...Поиск по нескольким критериям в объединенной таблице

У меня есть сайт рецепт, и я хочу быть способный искать рецепты на основе того, содержат ли они несколько ингредиентов. У меня есть две таблицы со всей информацией о рецептах и ​​второй стол с ингредиентами. Это то, что у меня есть, но он не извлекает никаких записей. Любая помощь будет оценена по достоинству. Благодаря!

SELECT recipe.ID, recipe.Title, recipe.Photo FROM ingredient 
LEFT JOIN recipe ON ingredient.Recipe_ID = recipe.ID 
WHERE (ingredient.Description = 'egg' AND ingredient.Description = 'sugar' AND ingredient.Description = 'salt') 
GROUP BY recipe.ID 
+0

Google "реляционное подразделение". – onedaywhen

ответ

1

Вы не получаете никаких результатов, потому что AND в вашей статье WHERE делает это невозможное условие, поскольку вы не будете иметь одну строку, в которой описание все эти значения одновременно.

0
select recipe.ID, recipe.Title, recipe.Photo 
from(
    select recipe.ID, recipe.Title, recipe.Photo 
    ,count(ingredient.description) as num_ingredients 
    from ingredient left join recipe 
    on ingredient.recipe_id=recipe.ID 
    group by 1,2,3 
    )ingred_count 
where num_ingredients>=2; 

Если вы хотите посмотреть рецепты с несколькими ингредиентами, это должно сделать трюк. В противном случае, если вы хотите количество ингредиентов для каждого рецепта, возьмите подзапрос.

0

Похоже, что таблица ingredient содержит Recipe_ID. Это действительно упростит этот запрос, поскольку все, что вам нужно сделать, - посмотреть, какие Recipe_ID происходят в нескольких строках.

SELECT I.recipe_id 
FROM ingredient I 
WHERE COUNT(I.description) > 0 
GROUP BY I.recipe_id 

предоставит удостоверение личности для всех таких рецептов. если вы хотите больше, чем просто ID вам понадобится присоединиться

SELECT R.* 
FROM ingredient I 
INNER JOIN recipe R on I.recipe_id = R.id 
WHERE COUNT(I.description) > 0 
GROUP BY I.recipe_id 

Я настоятельно рекомендую вам взглянуть на многие-ко-многим таблице, которую вы назвали бы что-то вроде recipe_to_ingredient. Таким образом, у вас есть таблица recipe, таблица ingredient и таблица recipe_to_ingredient, которая будет recipe_id/ingredient_id пары (и, возможно, составляет?)

2

Если вы хотите, чтобы все рецепты, которые имеют по крайней мере эти 3 ингредиентов, а затем попробовать:

SELECT recipe.ID, recipe.Title, recipe.Photo FROM recipe 
WHERE recipe.ID in (
    SELECT Recipe_ID 
    FROM ingredient 
    WHERE ingredient.Description in ('egg', 'sugar', 'salt') 
    HAVING count(distinct ingredient.Description) = 3 
    GROUP BY Recipe_ID 
) 
+0

Это сработало. Большое спасибо за то, что нашли время ответить! –

+0

@Jon: Отлично. Вы можете «принять» этот ответ, отметив флажок рядом с ним. – Gerrat