MySQL基于标准的一对多关系异常

时间:2018-03-13 11:36:06

标签: mysql database

请考虑以下事项。

我有一个RecipeComponents表,它与Ingredients有一对多的关系。

我想要来自表格Recepter的recept_navn的名字,不包括Raavare香菇。

Recept与receptkomponent有一对多的关系。一个接收器有许多接收器组件。

Receptkomponent与Raavare有一对多的关系。 Raavare包含在多个容器组件中。

最初我以为我会选择并加入三个表并为raaavare_navn制作一个where子句!=蘑菇。 由于它是一对多关系,而RecipeComponent表包含多个成分,我最终会删除带有蘑菇的行,但RecipeComponent仍然会显示其他成分的行

这是我最初尝试做的事情。

SELECT DISTINCT recept.recept_id, recept_navn
FROM recept
JOIN receptkomponent ON recept.recept_id = receptkomponent.recept_id
JOIN raavare ON raavare.raavare_id = receptkomponent.raavare_id
WHERE raavare.raavare_navn != 'champignon'
GROUP BY recept_id

DATA:

Tablename: Raavare
raavare_id    |    raavare_navn    |    leverandoer
___________________________________________________
1             |    dej             |    Wawelka
2             |    tomat           |    Knoor
3             |    tomat           |    Veaubais
4             |    tomat           |    Franz
5             |    ost             |    Ost og Skinke A/S
6             |    skinke          |    Ost og Skinke A/S
7             |    champignon      |    Igloo Frostvarer

Tablename:Receptkomponent

recept_id     |    raavare_id    |    nom_netto    |    tolerance
__________________________________________________________________
1             |    1             |    10.0         |    0.1
1             |    2             |    2.0          |    0.1
1             |    5             |    2.0          |    0.1
2             |    1             |    10.0         |    0.1
2             |    3             |    2.0          |    0.1
2             |    5             |    1.5          |    0.1
2             |    6             |    1.5          |    0.1
3             |    1             |    10.0         |    0.1
3             |    4             |    1.5          |    0.1
3             |    5             |    1.5          |    0.1
3             |    6             |    1.0          |    0.1
3             |    7             |    1.0          |    0.1

表名:接收者

recept_id    |    recept_navn
_____________________________
1            |    margherita
2            |    prosciutto
3            |    capricciosa

1 个答案:

答案 0 :(得分:0)

我想出了答案。

首先,您要创建一个查询,选择所有带有raavare'champignon'的recept_names。 然后,您创建一个查询,选择上一个查询不在的所有recept_names。

SELECT DISTINCT recept_navn
FROM recept
WHERE recept_navn NOT IN 
(
    SELECT DISTINCT recept_navn
    FROM recept
    JOIN receptkomponent
    ON receptkomponent.recept_id = recept.recept_id
    JOIN raavare 
    ON raavare.raavare_id = receptkomponent.raavare_id
    WHERE raavare_navn = 'champignon'
)