2013-11-14 3 views
0

У меня есть 3 таблицы базы данных. Первый, содержащий ингредиенты, второй, содержащий блюда, и третий, который объединяет как ингредиенты, так и блюда.SQL Объединяет вопрос

Description

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

Восстанавливает все ингредиенты для конкретного блюда.

SELECT * 
FROM Ingredient As I 
JOIN DishIngredients as DI 
    ON I.ID = DI.IngredientID 
WHERE DI.DishID = 1; 

Но если я стараюсь не запрашивать блюдо Название и описание независимо от того, какие о присоединиться я использую я всегда получаю количество результатов, равное количеству используемых ингредиентов. Если у меня есть 4 ингредиента в моем блюде, тогда выбор возвращает имя и описание 4 раза, как я могу изменить свой выбор, чтобы выбрать эти значения только один раз?

Вот результат моего запроса (так же, как и у ястребов), если я попытаюсь выбрать «Имя и описание». Я использую MS SQL.

ID   Name  Description               DishID IngredientID 
-- -------------------- -------------------------------------------------------------------- ------ --------- 
1 Spaghetti Carbonara This delcitious pasta is made with fresh Panceta and Single Cream 1  1 
1 Spaghetti Carbonara This delcitious pasta is made with fresh Panceta and Single Cream 1  2 

Запрос Kuzgun отлично подходит для меня. Однако из ваших предложений я вижу, что мне действительно не нужно соединяться между DishIngredient и Dish. Когда мне нужно имя и я могу! Описание просто пойти на

SELECT * FROM Dish WHERE ID=1; 

Wehn ​​мне нужен список Ингредиент я могу использовать выше запрос.

+1

«Если я попытаюсь запросить имя и описание блюд, независимо от того, какой тип соединения я использую, я всегда получаю количество результатов, равное количеству используемых ингредиентов». Если это то, чего вы хотите, вам не требуется соединение. – dasblinkenlight

+0

Можете ли вы привести пример того, что вы хотите, и каков ваш запрос? А также укажите, какие dbms вы используете? mysql/sql server ... – unlimit

ответ

1

Если вам нужно отобразить обе тарелки детали и ингредиент детали, вы должны объединить все 3 таблицы:

SELECT * 
FROM Ingredient As I 
JOIN DishIngredients as DI 
    ON I.ID = DI.IngredientID 
JOIN Dish AS D 
    ON D.ID=DI.DishID 
WHERE DI.DishID = 1; 
0

Если вы не заботитесь о ингредиентом, вы не должны использовать таблицу DishIngredient Просто используйте сказку. select * from dish d where d.id=1. Если вы хотите знать, что такое ингредиент, то sql, который вы используете, просто запрашивает идентификатор ингредиента таблицы. Это бесполезно. Из-за дизайна вашей базы данных требуется небольшая избыточность.

select * from dish d join dishingredient di on d.id=di.dishid join ingredient i on  
i.id=di.ingredientid where d.id=1 

Конечно, вы получите количество результатов, содержащих название и описание блюд. Если вы хотите, чтобы получить полную информацию, но наименьшую избыточность, вы можете сделать это в два этапа:

select * from dish d where d.id=1; 
select * from ingredient i join DishIngredient di on i.id=di.ingredientid where  di.dishid=1 

В Java, вы можете написать класс для представления блюдо и список для представления ингредиентов это использовать ,

Смежные вопросы