mysql查询选择除了之外的所有内容

时间:2013-11-12 13:09:12

标签: mysql

我正在尝试选择只在食物表中购买蔬菜的顾客。但我不能使用除了查询。我怎么能这样做?

    create table Order (
        email varchar(30),
        nOrder integer,
        primary key (email, nOrder),
        foreign key (email) references Client(email)
    );

    create table RegisterOrder (
        email varchar(30),
        nOrder integer,
        nameA varchar(30),
        primary key (email,nOrder,nameA),
        foreign key (email,nOrder) references Order(email, nOrder),
        foreign key (nameA) references Dishe(nameA)
    );

create table Dishe(
    nameA varchar(30),
    primary key (nameA),
    foreign key (nameA) references Food(nameA));

    create table Food ( 
      nameA varchar(30), 
      type varchar(30),
      primary key (nameA)
    );

2 个答案:

答案 0 :(得分:2)

考虑这个例子......

 SELECT * FROM recipes;
 +-----------+---------------------------------+
 | recipe_id | recipe                          |
 +-----------+---------------------------------+
 |         6 | Beans & Macaroni                |
 |         9 | Beans on Jacket Potato          |
 |         3 | Beans on Toast                  |
 |        10 | Cheese & Beans on Jacket Potato |
 |         4 | Cheese & Beans on Toast         |
 |         2 | Cheese on Toast                 |
 |         1 | Macaroni & Cheese               |
 |        12 | Peanut Butter on Toast          |
 |         5 | Toast & Jam                     |
 +-----------+---------------------------------+

 SELECT * FROM recipe_ingredient;
 +-----------+---------------+
 | recipe_id | ingredient_id |
 +-----------+---------------+
 |         1 |             1 |
 |         1 |             2 |
 |         2 |             2 |
 |         2 |             4 |
 |         3 |             3 |
 |         3 |             4 |
 |         4 |             2 |
 |         4 |             3 |
 |         4 |             4 |
 |         5 |             4 |
 |         5 |             5 |
 |         6 |             1 |
 |         6 |             3 |
 |         9 |             3 |
 |         9 |             6 |
 |        10 |             2 |
 |        10 |             3 |
 |        10 |             6 |
 |        12 |             4 |
 |        12 |             7 |
 +-----------+---------------+

 SELECT * FROM ingredients;
 +---------------+---------------+
 | ingredient_id | ingredient    |
 +---------------+---------------+
 |             3 | Beans         |
 |             2 | Cheese        |
 |             6 | Jacket Potato |
 |             5 | Jam           |
 |             1 | Macaroni      |
 |             7 | Peanut Butter |
 |             4 | Toast         |
 +---------------+---------------+

以下内容返回所有食谱的列表以及构建它们所需的成分......

 SELECT r.*
      , i.*
   FROM recipes r
   JOIN recipe_ingredient ri
     ON ri.recipe_id = r.recipe_id
   JOIN ingredients i
     ON i.ingredient_id = ri.ingredient_id;
 +-----------+---------------------------------+---------------+---------------+
 | recipe_id | recipe                          | ingredient_id | ingredient    |
 +-----------+---------------------------------+---------------+---------------+
 |         6 | Beans & Macaroni                |             1 | Macaroni      |
 |         6 | Beans & Macaroni                |             3 | Beans         |
 |         9 | Beans on Jacket Potato          |             3 | Beans         |
 |         9 | Beans on Jacket Potato          |             6 | Jacket Potato |
 |         3 | Beans on Toast                  |             3 | Beans         |
 |         3 | Beans on Toast                  |             4 | Toast         |
 |        10 | Cheese & Beans on Jacket Potato |             2 | Cheese        |
 |        10 | Cheese & Beans on Jacket Potato |             3 | Beans         |
 |        10 | Cheese & Beans on Jacket Potato |             6 | Jacket Potato |
 |         4 | Cheese & Beans on Toast         |             2 | Cheese        |
 |         4 | Cheese & Beans on Toast         |             3 | Beans         |
 |         4 | Cheese & Beans on Toast         |             4 | Toast         |
 |         2 | Cheese on Toast                 |             2 | Cheese        |
 |         2 | Cheese on Toast                 |             4 | Toast         |
 |         1 | Macaroni & Cheese               |             1 | Macaroni      |
 |         1 | Macaroni & Cheese               |             2 | Cheese        |
 |        12 | Peanut Butter on Toast          |             4 | Toast         |
 |        12 | Peanut Butter on Toast          |             7 | Peanut Butter |
 |         5 | Toast & Jam                     |             4 | Toast         |
 |         5 | Toast & Jam                     |             5 | Jam           |
 +-----------+---------------------------------+---------------+---------------+

现在让我们假设我们有一个包含奶酪,豆子和吐司的食品室。我们只能用这些成分构建什么?

 SELECT r.*
      , SUM(CASE WHEN ingredient IN ('Cheese','Beans','Toast') THEN 1 ELSE 0 END) x
      , COUNT(*) y
   FROM recipes r
   JOIN recipe_ingredient ri ON ri.recipe_id = r.recipe_id
   JOIN ingredients i ON i.ingredient_id = ri.ingredient_id
  GROUP
     BY r.recipe_id;
 +-----------+---------------------------------+------+---+
 | recipe_id | recipe                          | x    | y |
 +-----------+---------------------------------+------+---+
 |         1 | Macaroni & Cheese               |    1 | 2 |
 |         2 | Cheese on Toast                 |    2 | 2 | <-- 
 |         3 | Beans on Toast                  |    2 | 2 | <--
 |         4 | Cheese & Beans on Toast         |    3 | 3 | <-- *
 |         5 | Toast & Jam                     |    1 | 2 |
 |         6 | Beans & Macaroni                |    1 | 2 |
 |         9 | Beans on Jacket Potato          |    1 | 2 |
 |        10 | Cheese & Beans on Jacket Potato |    2 | 3 |
 |        12 | Peanut Butter on Toast          |    1 | 2 |
 +-----------+---------------------------------+------+---+

 x = y : recipes use only those ingredients found in the pantry.

 x = y = total no of ingredients in pantry : recipes using EXACTLY the ingredients found in the pantry

这可以改写......

 SELECT r.*
   FROM recipes r
   JOIN recipe_ingredient ri ON ri.recipe_id = r.recipe_id
   JOIN ingredients i ON i.ingredient_id = ri.ingredient_id
  GROUP
     BY r.recipe_id
 HAVING  SUM(CASE WHEN ingredient IN ('Cheese','Beans','Toast') THEN 1 ELSE 0 END) = COUNT(*);

答案 1 :(得分:0)

select ro.email
from registerorder ro 
inner join food f on f.namea = ro.namea
group by ro.email
having sum(f.type <> 'vegtables') = 0