gpt4 book ai didi

mysql - 运行多个数据库查询的替代方法

转载 作者:行者123 更新时间:2023-11-29 16:42:40 24 4
gpt4 key购买 nike

我正在开发一个具有搜索功能的网络应用程序。一般来说,用户可以在特定类别或类别组下进行搜索。示例:

Mammal (group)
Cat (category)
Dog (category)

Mammal、Cat 和 Dog 是数据库中的表,并在源代码中由它们自己的类表示。 Cat和Dog之间的公共(public)字段存储在Mammal中; Cat 和 Dog 都有一组独特的字段。我试图找出当用户在组(而不是特定类别)下搜索时执行查询(或多个查询)的最佳方式。例如,用户搜索“所有4岁以下的哺乳动物”。作为响应的一部分,我想返回表中属于哺乳动物类别(在本例中为猫和狗)的所有字段。

鉴于表 Cat 和 Dog 具有独特的字段,似乎(根据我的谷歌搜索)我需要运行多个查询(每个类别一个)。事实确实如此吗?如果是这样,最有效的方法是什么?如果没有,我将如何通过单个查询运行这样的请求?

本质上,我的问题是:针对我上面描述的情况执行查询的最有效方法是什么?

[编辑]带查询的数据库示例: https://www.db-fiddle.com/f/na9ctPmi6CjyDB4MNnjycb/3

在上面链接的示例中,有两个查询,它们一起可以获取用户搜索的所有数据(如上所述)。我想知道是否有办法通过单个查询或至少对数据库的单个调用来完成此操作。

到目前为止,我已经尝试了多次查询调用的简单方法。这工作正常(只要没有任何错误)。我担心的是,当存储的数据积累到数百/数千时,这种方法会变得太慢。此外,我当前的方法需要在源代码中进行额外的数据处理。例如,如果用户想要从搜索中获得前 5 个结果,那么我必须从每个表中获取前 5 个结果,创建数据库结果的聚合集合,对集合进行排序,然后从排序后的结果中选取前 5 个结果集合返回给用户。我想知道是否有一种方法可以在数据库端完成所有这些(假设它会更快)。

最佳答案

来自您的sqlfiddle:

select * from cat left join mammal on (cat.id = mammal.id) where age <  4
union all
select * from dog left join mammal on (dog.id = mammal.id) where age < 4

几点:

  • 例如,如果您想显示没有相应 dog 的哺乳动物的线条,则只需使用 left join >猫。就您而言,这似乎不是您想要的,因此最好使用 inner join (或简单地 join,默认为内部联接)。这样,如果没有狗,只有 2 只猫,结果将仅显示 2 行,而不是 2 只猫 + 1 只不存在的狗。

  • 为每种哺乳动物类型制作一张表无法扩展。如果您的用户现在想要添加郊狼,会发生什么?还是兔子?每次需要将新的哺乳动物添加到系统中时,您都需要创建一个新表。执行此操作的正确方法是创建一个连接表,其中详细说明:

    • 表格animal_type,其中的行如下:

      animal_type_id 名称

    • 然后您将拥有一个名为 attribute_type 的单独表,其中包含如下内容:

      attribute_id 名称

    • 名为animals的单独表:

      animal_id Animal_type_id

    • 最后您将拥有一个名为 animal_attributes 的单独表:

      id Animal_id attribute_id 值

现在,您只需在 animals 中插入一行,指定 animal_type_id(可以是猫/狗/其他)即可添加动物。您只需要事先创建animal_type 即可。然后,通过在 animal_attributes 中创建行,引用刚刚创建的 animal_id 以及正确的 animal_attribute_id,为动物添加属性,它们可以是共享属性,如颜色、长度、大小和独特的猫/狗/动物字段。

关于mysql - 运行多个数据库查询的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53264478/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com