首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在联接结果中过滤MySQL中的结果

在联接结果中过滤MySQL中的结果
EN

Stack Overflow用户
提问于 2020-02-16 09:00:19
回答 3查看 63关注 0票数 0

我是初级程序员。我的MySQL查询有一些小问题。这是我的MySQL数据:https://pastebin.com/69PcBSVH

我有这张桌子:

代码语言:javascript
复制
CREATE TABLE `dishes` (
  `id` bigint(20) UNSIGNED NOT NULL,
  `company_id` bigint(20) UNSIGNED NOT NULL,
  `name` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `description` longtext COLLATE utf8mb4_unicode_ci,
  `enable` char(1) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '1',
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;


CREATE TABLE `dish_values` (
  `id` bigint(20) UNSIGNED NOT NULL,
  `dishes_id` bigint(20) UNSIGNED NOT NULL,
  `food_ingredient_id` bigint(20) UNSIGNED NOT NULL,
  `company_id` bigint(20) UNSIGNED NOT NULL,
  `quantity` decimal(9,2) NOT NULL DEFAULT '0.00'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;


CREATE TABLE `food_ingredients` (
  `id` bigint(20) UNSIGNED NOT NULL,
  `company_id` bigint(20) UNSIGNED NOT NULL,
  `name` varchar(120) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `garbage` decimal(9,2) NOT NULL DEFAULT '0.00',
  `energy_value` decimal(9,2) NOT NULL DEFAULT '0.00',
  `protein` decimal(9,2) NOT NULL DEFAULT '0.00',
  `fat` decimal(9,2) NOT NULL DEFAULT '0.00',
  `available_carbohydrates` decimal(9,2) NOT NULL DEFAULT '0.00',
  `roughage` decimal(9,2) NOT NULL DEFAULT '0.00',
  `description` longtext COLLATE utf8mb4_unicode_ci,
  `url_address` varchar(160) COLLATE utf8mb4_unicode_ci NOT NULL,
  `allergen` char(1) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0',
  `allergen1` char(1) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0',
  `allergen2` char(1) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0',
  `allergen3` char(1) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0',
  `available_in_demo` char(1) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0',
  `enable` char(1) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '1'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

我的基地是准备菜肴所需的菜肴和配料的基础。

我需要显示所有的菜,不是过敏原(food_ingredients.allergen = 0)。

代码语言:javascript
复制
Table dishes = given dishes
Table dish_values = ingredients that are assigned to a given dish
Food_ingredients table = ingredients of the dish.

在变应原栏中,属于过敏原的碟子值为1,而那些不是过敏原的盘子值为0。

我询问我的菜(没有过敏原):

代码语言:javascript
复制
SELECT 
  dishes.id, dishes.company_id, dishes.name, dishes.description, dishes.enable
FROM `dishes`  join dish_values on dish_values.dishes_id = dishes.id 
      join food_ingredients on food_ingredients.id = dish_values.food_ingredient_id 
WHERE food_ingredients.allergen = 0 
GROUP BY dishes.id

但效果不太好。

因此,我有含有过敏原的菜肴和没有过敏原的菜肴。

怎么修理呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-02-16 11:24:19

我将使用not’exists与相关子查询:这避免了聚合的需要,这通常不利于大型数据集的性能:

代码语言:javascript
复制
select d.*
from dishes d
where not exists (
    select 1
    from dish_values v 
    inner join food_ingredients i on i.id = v.food_ingredient_id
    where 
        v.dishes_id = d.id 
        and i.allergen = 1
)

为了提高性能,需要使用以下索引:food_ingredients(allergen, id)

附带注意:您应该将allergen的数据类型从char(1)更改为tinyint(1),因为它只包含0/1的值。

票数 0
EN

Stack Overflow用户

发布于 2020-02-16 09:08:42

由于过敏原是一个炭列,你需要引号周围的0。或者,您可以将列更改为int。

票数 0
EN

Stack Overflow用户

发布于 2020-02-16 10:02:21

删除WHERE子句并将条件添加到HAVING子句中:

代码语言:javascript
复制
SELECT d.id, d.company_id, d.name, d.description, d.enable
FROM dishes d 
INNER JOIN dish_values v ON v.dishes_id = d.id 
INNER JOIN food_ingredients i ON i.id = v.food_ingredient_id 
GROUP BY d.id, d.company_id, d.name, d.description, d.enable
HAVING SUM(i.allergen) = 0 

条件SUM(i.allergen) = 0确保表food_ingredients中的所有匹配行都有i.allergen = 0

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60246932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档