我正在开发具有搜索功能的网络应用。一般来说,用户可以在特定类别或类别组下进行搜索。示例:
Mammal (group)
Cat (category)
Dog (category)
哺乳动物,猫和狗是数据库中的表,在源代码中由它们自己的类表示。猫和狗之间的共同字段存储在哺乳动物中;猫和狗都有一组独特的字段。我正在尝试找出当用户在某个组(而不是特定类别)下进行搜索时执行查询(或多个查询)的最佳方法。例如,用户搜索“ 4岁以下的所有哺乳动物”。作为响应的一部分,我想返回表中属于哺乳动物类别的所有字段(在这种情况下为猫和狗)。
鉴于Cat和Dog表具有唯一的字段,(根据我的谷歌搜索)似乎需要运行多个查询(每个类别一个)。确实是这样吗?如果是这样,最有效的方法是什么?如果没有,我将如何通过单个查询运行这样的请求?
从本质上来说,我的问题是:针对上述情况执行查询的最有效方法是什么?
[编辑] 带查询的数据库示例: https://www.db-fiddle.com/f/na9ctPmi6CjyDB4MNnjycb/3
在上面的链接中的示例中,有两个查询,它们可以一起获取用于用户搜索的所有数据(如上所述)。我想知道是否有一种方法可以通过单个查询,或者至少是对数据库的单个调用。
到目前为止,我已经尝试过使用多个查询调用的幼稚方法。这可以很好地工作(因为没有任何错误,所以声名狼藉)。我担心的是,当存储的数据累积到数百/数千时,此方法将变得太慢。此外,我目前的方法要求在源代码中进行其他数据处理。例如,如果用户希望从搜索结果中获得前5个结果,那么我必须从每个表中获得前5个结果,创建数据库结果的聚合集合,对集合进行排序,然后从排序后的结果中选择前5个结果集合返回给用户。我想知道是否有一种方法可以在数据库端完成所有这些工作(假设会更快)。
答案 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
来向动物添加属性,这些属性可以是颜色,长度等共享属性,大小和唯一的猫/狗/动物字段。