当前位置: 首页 > 面试题库 >

配方数据库,按成分搜索

毛胜
2023-03-14
问题内容

我的数据库中有以下3个表,在查询它们以获得所需结果时遇到了一些麻烦。我正在尝试按成分搜索食谱。

SQL Fiddle的以下模式: fiddle

这是我的桌子:配料

+---------------+---------+
| ingredient_id | name    |
+---------------+---------+
|             1 | tomato  |
|             2 | onion   |
|             3 | rice    |
|             4 | chicken |
|             5 | beef    |
|             6 | noodles |
|             7 | salt    |
+---------------+---------+

菜谱

+-----------+------------------+
| recipe_id | name             |
+-----------+------------------+
|         1 | tomato goodness  |
|         2 | meat deluxe      |
|         3 | chicken surprise |
+-----------+------------------+

成分索引

+-----------+---------------+
| recipe_id | ingredient_id |
+-----------+---------------+
|         1 |             1 |
|         1 |             5 |
|         1 |             7 |
|         2 |             5 |
|         2 |             6 |
|         2 |             7 |
|         3 |             4 |
|         3 |             3 |
|         3 |             7 |
+-----------+---------------+

查询仅搜索一种成分的查询效果很好,并输出以下内容:

mysql> select r.recipe_id, r.name
    -> from recipes r
    -> inner join ingredient_index
    -> on i.recipe_id = r.recipe_id
    -> where
    -> i.ingredient_id = 7;

+-----------+------------------+
| recipe_id | name             |
+-----------+------------------+
|         1 | tomato goodness  |
|         2 | meat deluxe      |
|         3 | chicken surprise |
+-----------+------------------+

但是当使用或用于多种成分时,我们得到了

mysql> select r.name
    -> from recipes r
    -> inner join ingredient_index i
    -> on i.recipe_id = r.recipe_id
    -> where i.ingredient_id = 7 or i.ingredient_id = 5;

+------------------+
| name             |
+------------------+
| tomato goodness  |
| tomato goodness  |
| meat deluxe      |
| meat deluxe      |
| chicken surprise |
+------------------+

设置5行(0.00秒)

并没有使用“和”结果

    mysql>  select r.name
    ->  from recipes r
    ->  inner join ingredient_index i
    ->  on i.recipe_id = r.recipe_id
    ->  where i.ingredient_id = 7 and i.ingredient_id = 5;
Empty set (0.00 sec)

任何帮助将非常感激!


问题答案:

由于配方可以使用多种成分,并且您正在寻找使用指定的一种或多种成分DISTINCT的配方,因此,如果配方使用指定列表中的一种以上成分,则应使用关键字来防止重复结果。另外,您可以使用IN子句来筛选多个成分ID。

select DISTINCT r.name
from 
    recipes r
    inner join ingredient_index i
    on i.recipe_id = r.recipe_id
where i.ingredient_id IN (7, 5);

或者,如果要查找使用列表中指定的所有成分的配方,则可以按配方名称对结果进行分组,并检查记录数是否与列表中的成分数相同。

select r.name
from 
    recipes r
    inner join ingredient_index i
    on i.recipe_id = r.recipe_id
where i.ingredient_id IN (7, 5)
GROUP BY r.name
HAVING COUNT(*) = 2

假设不会有重复的记录具有相同的(recipe_id,Ingredient_id)元组(最好通过UNIQUE约束确保)。



 类似资料:
  • 问题内容: 默认情况下,Redis配置了16个数据库,编号为0-15。这仅仅是名称间隔的一种形式,还是按数据库隔离会对性能产生影响? 例如,如果我使用默认数据库(0),并且有1000万个键,则最佳实践建议使用 keys 命令按通配符模式查找键效率低下。但是,如果我存储我的主键,也许是8个段键的前4个段,结果导致在单独的数据库(例如数据库3)中的键子集要小得多。Redis是将它们视为较小的一组密钥,

  • 问题内容: 我是使用Redis DB的新手。在阅读了一些文档并浏览了Internet上的一些示例并扫描了stackoverflow.com之后,我可以看到Redis速度非常快,可扩展性很好,但这要付出代价,我们必须考虑一下数据的处理方式在设计时访问它们,以及它们将要执行的操作。我能理解这一点,但对于使用普通的旧SQL这么简单却又缓慢地在数据中搜索感到有些困惑。我可以用KEY命令以一种方式完成此操作

  • 查看其他关于堆栈溢出的问题,有人说这可能是因为valueEventListener的位置不正确,但...不是吗?我正在钻进食物条目/营养条目,但我不知道如何钻进更深。没办法匿名给孩子打电话?我尝试调用childEventListener而不是valueEventListener,其他的都一样,但我再也没有得到那个消息,但我仍然无法检索到我想要的数据。 编辑: 谢谢你到目前为止的帮助。根据下面Has

  • 我有一个基于Spring框架的项目,它只基于Java配置进行初始化。这意味着不需要使用web.xml文件。 您可以在下面的图像中看到项目的结构: Java 7 Spring framework 4.2.1.发布 HibernateORM 5.0.4.final Spring Tool Suite IDE 3.6.2 Maven3 Tomcat 7 数据源 而SystemSettings保存数据库的

  • 发出来攒人品 1.讲述一个项目 2.讲述实习中跟的一个项目 3.有做过ABtest吗,有了解吗 4.有常用的软件吗,最喜欢的一个功能是什么(说了b站,单列视频) B站为什么要上线单列功能,为什么有了双列还要单列 如果你是b站的数据分析师,怎么验证单列功能上线,ABtest核心指标 如果b站用户反馈推的视频太雷同了,作为数据分析师怎么推进解决 5.sql问题,窗口函数是什么 面试评价:框架感薄弱、单

  • Adding the capability to connect databases to Express apps is just a matter of loading an appropriate Node.js driver for the database in your app. This document briefly explains how to add and use som