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

时间:2018-11-12 14:40:29

标签: mysql mybatis

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

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

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

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

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

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

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

到目前为止,我已经尝试过使用多个查询调用的幼稚方法。这可以很好地工作(因为没有任何错误,所以声名狼藉)。我担心的是,当存储的数据累积到数百/数千时,此方法将变得太慢。此外,我目前的方法要求在源代码中进行其他数据处理。例如,如果用户希望从搜索结果中获得前5个结果,那么我必须从每个表中获得前5个结果,创建数据库结果的聚合集合,对集合进行排序,然后从排序后的结果中选择前5个结果集合返回给用户。我想知道是否有一种方法可以在数据库端完成所有这些工作(假设会更快)。

1 个答案:

答案 0 :(得分:0)

从您的sqlfiddle中获取:

/* Styles go here */

.container{
   width: 100%;
    height: 100%;
    background: #000000d6;
    font-size: 19px;
    color: #a19999;
    position: relative;
}

.contents{
    margin-bottom: 15px;
    border-bottom: 1px solid #424242;
    padding: 20px;
    visibility: hidden;
}

.center-band{
    width: 98%;
    height: 78px;
    z-index: 200;
    background: #b4b1b147;
    position: fixed;
    top: 50%;
}

.wrapper{
  position: relative;
}

.over{
  background-color: red;
}

几点:

  • 例如,仅当您想显示没有对应的<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div class="wrapper"> <div class="container"> <div class="contents"> (1) Lorem ipsum dolor sit amet, consectetur adipisicing elit. Necessitatibus fugit eius perferendis veritatis accusantium corporis nulla alias sed possimus quibusdam reiciendis nisi maiores inventore error, incidunt eveniet ut asperiores officiis.</div> <div class="contents">(2) Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima, distinctio temporibus facere, laboriosam doloribus error quaerat ipsa, non nobis rerum mollitia quibusdam quas illo a qui consequuntur consectetur deleniti saepe.</div> <div class="contents">(3) Lorem ipsum dolor sit amet, consectetur adipisicing elit. Unde, sed, atque. Adipisci quasi debitis, soluta praesentium distinctio impedit veritatis officia molestias culpa fuga excepturi voluptates suscipit aliquam ea unde, non!</div> <div class="contents">(4) Lorem ipsum dolor sit amet, consectetur adipisicing elit. Consequuntur, incidunt, harum. Perferendis ipsum, molestias nihil sequi nam nulla, aliquid ipsa numquam cum! Perferendis ut voluptates hic excepturi dolores, ipsum impedit.</div> <div class="contents">(5) Lorem ipsum dolor sit amet, consectetur adipisicing elit. Enim itaque debitis voluptates, reiciendis dolorum, labore eius. Illum similique ex, iusto rerum ratione minima, corporis aspernatur aliquam, itaque numquam sint enim!</div> <div class="contents">(6) Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sint numquam totam, a aliquam veritatis porro ullam! Nostrum sint ipsum odio aperiam deserunt aut placeat dignissimos est ad, quae vitae aliquid.</div> <div class="contents">(7) Lorem ipsum dolor sit amet, consectetur adipisicing elit. Et quos atque enim, alias culpa quibusdam ratione, beatae non possimus, velit eaque. Optio qui saepe, earum harum beatae maxime obcaecati minima.</div> <div class="contents">(8) Lorem ipsum dolor sit amet, consectetur adipisicing elit. Hic id incidunt sapiente, magni, sequi ea molestiae iure maxime delectus doloribus error assumenda veritatis maiores saepe nihil neque autem similique obcaecati!</div> <div class="contents">(9) Lorem ipsum dolor sit amet, consectetur adipisicing elit. Voluptatum velit hic iure nam nulla natus corrupti eveniet, suscipit voluptates nostrum. Cupiditate vero ipsam alias fuga, magnam voluptas deserunt corporis non!</div> <div class="contents">(10) Lorem ipsum dolor sit amet, consectetur adipisicing elit. Repudiandae voluptatibus accusamus pariatur? Ipsum nobis ratione fuga, voluptates quam placeat officia odit eveniet aliquam, eaque quisquam tenetur! Exercitationem maxime vel quas!</div> </div> <div class="center-band"> </div> </div>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 的哺乳动物的行时,才需要left join。在您的情况下,这似乎不是您想要的,因此最好使用dog(或简单地使用cat,它默认为内部的)。这样,如果没有狗,只有2只猫,则结果将只显示2行,而不是2条猫+ 1条不存在的狗。

  • 为每种哺乳动物类型制作一张桌子不会扩展。如果您的用户现在想要添加土狼会怎样?还是兔子?每次需要将新的哺乳动物添加到系统中时,都需要创建一个新表。正确的方法是创建一个详细的联接表:

    • inner join,行如下:

      join

    • 然后您将有一个名为animal_type的单独表,其内容如下:

      animal_type_id name

    • 称为attribute_type的单独表:

      attribute_id name

    • 最后,您将有一个名为animals的单独表:

      animal_id animal_type_id

现在,您只需在animal_attributes中插入一行,并指定id animal_id attribute_id value(可以是猫/狗/任何动物),即可添加动物。您只需要事先创建animal_type。然后,通过在animals中创建行,引用刚刚创建的animal_type_id以及适当的animal_attributes来向动物添加属性,这些属性可以是颜色,长度等共享属性,大小和唯一的猫/狗/动物字段。