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

无需多个类似操作符即可检索多个单个或引用的数据

戚正业
2023-03-14
问题内容

我有两个表,如下所示。在employee表中,而不是直接提及技能,我将其用作其他表的参考。

问题

select * from Employee where Skills = "1";

上面的查询将显示仅具有“ Python”技能的员工记录。当然,它不会显示包含Python的其他组合,例如“
1,2”(Python,Java)。如果不使用类似的运算符,我怎么能做到这一点,因为如果我有10、11、21的技能,那就不是问题了。

如果您觉得这种使用参考的方法很困难或不建议使用,请提出您的想法:-)

员工表:

+-----+-------------+-------------+
| id  | Name        | Skills      |
+-----+-------------+-------------+
| 1   | Xyz         | 1,2,4       |
| 2   | Xyy         | 1,3         |
| 3   | Abc         | 1,2,3       |
| 4   | Asd         | 1           |
+-----+-------------+-------------+

技能表:

+-----+-------------+
| id  | SkillSet    |
+-----+-------------+
| 1   | Python      |
| 2   | Java        |
| 3   | C           |
| 4   | PHP         |
+-----+-------------+

问题答案:

考虑以下

mysql> select * from employee ;
+------+------+--------+
| id   | name | skills |
+------+------+--------+
|    1 | xyz  | 1,2,4  |
|    2 | abc  | 1,3    |
|    3 | lmn  | 1,2,3  |
+------+------+--------+
3 rows in set (0.00 sec)

mysql> select * from skillset ;
+------+----------+
| id   | skillset |
+------+----------+
|    1 | Python   |
|    2 | Java     |
|    3 | C        |
|    4 | PHP      |
+------+----------+
4 rows in set (0.00 sec)

这种结构与您的结构相似,但是在这种情况下可以进行查询,但是我们可以使用,find_in_set但是效率很低,这里有几个示例

mysql> select e.id,
e.name, 
group_concat(s.skillset) as skillset 
from employee e join skillset s 
on find_in_set(s.id,e.skills) > 0 
where find_in_set(1,e.skills) > 0 
 group by e.id ;
+------+------+-----------------+
| id   | name | skillset        |
+------+------+-----------------+
|    1 | xyz  | Python,Java,PHP |
|    2 | abc  | C,Python        |
|    3 | lmn  | Java,Python,C   |
+------+------+-----------------+
3 rows in set (0.00 sec)

select e.id,
e.name, 
group_concat(s.skillset) as skillset 
from employee e 
join skillset s on find_in_set(s.id,e.skills) > 0 
where find_in_set(2,e.skills) > 0  group by e.id ;
+------+------+-----------------+
| id   | name | skillset        |
+------+------+-----------------+
|    1 | xyz  | Python,PHP,Java |
|    3 | lmn  | C,Java,Python   |
+------+------+-----------------+

现在,适当的规范化将使生活变得更加简单,并将具有以下关联表

mysql> select * from employee_skills; 
+------------+----------+
| idemployee | idskills |
+------------+----------+
|          1 |        1 |
|          1 |        2 |
|          1 |        3 |
|          2 |        1 |
|          2 |        3 |
|          3 |        1 |
|          3 |        2 |
|          3 |        3 |
+------------+----------+

现在,在这种情况下执行查询将更加高效

mysql> select e.id,
e.name,
s.skillset from employee e 
join employee_skills es on es.idemployee = e.id 
join skillset s on s.id = es.idskills where s.id = 1 ;
+------+------+----------+
| id   | name | skillset |
+------+------+----------+
|    1 | xyz  | Python   |
|    2 | abc  | Python   |
|    3 | lmn  | Python   |
+------+------+----------+

使用最后一种方法,可以很容易地完成更复杂的计算。



 类似资料:
  • 问题内容: 想象一个有多列的表,例如。我通常按​​进行选择,但是,客户端应用程序中有多个查询,它们对列的子集使用各种条件。 当MySQL在多列有多个WHERE条件的单个表上执行查询时,它真的可以利用在不同列上创建的索引吗?还是使其快速的唯一方法是为所有可能的查询创建多列索引? 问题答案: 是的,MySQL可以对单个查询使用多个索引。优化器将确定哪些索引将使查询受益。您可以用来获取有关MySQL如何

  • 问题内容: 我在同一台Ubuntu服务器上有一个Rails 3应用程序的暂存和生产实例(使用tyre gem)。看来这两个实例都共享相同的elasticsearch索引,这显然不是我想要的。 如何使生产和登台实例使用单独的实例? 问题答案: 您需要覆盖索引名称。假设您要绑定ActiveRecord,它将根据相关模型创建索引名称。您可以使用这样的前缀来调整名称; 然后会创建一个名为的索引,以此类推。

  • 当我遇到伪造的问题时,我正在Raspberry Pi上设置一个改装的Minecraft服务器。我之前设置了一个运行1.17的香草服务器,这需要Java16,但我需要Java15或更低的伪造。我之前安装了Java16 JDK从https://adoptopenjdk.net/releases.htmlarm32架构,它运行得非常好。我试图安装服务器的伪造版本是1.16.5。我下载了安装程序,它运行得

  • 问题内容: 我有一个使用MVC模式开发的应用程序,我现在希望为其建立多个模型的索引,这意味着每个模型具有不同的数据结构。 使用多个索引(每个模型一个索引还是在每个模型的相同索引中使用一个类型)是更好的选择吗?我认为这两种方式都需要不同的搜索查询。我刚刚开始。 如果数据集很小或很大,这两个概念在性能上是否存在差异? 如果有人可以为我推荐一些好的样本数据,我自己会测试第二个问题。 问题答案: 两种方法

  • 按照文档的规范示例,假设我想在elasticsearch中存储推文,但我想指定一个处理两个以上字段的endpoint,例如。 在本例中,我想在推特上建立索引,但也要在推特句柄和月份上建立索引,包括推特类型和id。 这是可能的,还是唯一可能的映射类似于他们提供的东西,一个和一个,例如?

  • 问题内容: 我在Java中有这样的双重经历。 现在,我想做的是通过循环在列表的零索引中添加5个值,在索引1中添加5个值。 第零个索引将具有值 索引1将具有值 并且所有这些值都按以下顺序存储在双精度数组中 我该怎么做? 问题答案: @Ahamed有一点,但是如果您坚持使用列表,那么可以有三个这样的arraylist: 编辑: 如果您在下面的列表中有这些值: 你想做的就是把它们结合起来,对吗?您可以尝