首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sql查询优化

Sql查询优化
EN

Stack Overflow用户
提问于 2014-09-20 00:22:23
回答 1查看 53关注 0票数 0

我的ch_skills表看起来像

代码语言:javascript
复制
uid | skill1 | skill2 | skill3 | skill4 | skill5
1     1        2        2        0        1
2     1        1        2        1        1
3     1        2        3        0        1

我的第一个问题:这是对的吗?我是说,如果我这样做会更好吗?

代码语言:javascript
复制
uid | skillid | skill_lvl
1     1         1
1     2         2
1     3         2
1     4         0
1     5         1

到目前为止,示例1的所有操作都很好,但是现在我在sql查询方面遇到了麻烦。目前,我正在使用5种不同的查询来获取每种技能的级别。我使用以下代码:

对于skill1:

代码语言:javascript
复制
$query = $this->db->prepare("SELECT `skills`.`skill_ID` as `Skill1_id`, 
   `skill_name`.`skill_name` as `Skill1_name`, `skill_level` as `Skill1_level`, 
   `skill_price` as `Skill1_price` 
   FROM `skills`, `skill_name`, `ch_skills` 
   WHERE `skill_name`.`skill_ID` = `skills`.`skill_ID` 
   AND `skills`.`skill_ID`= 1 
   AND `skills`.`skill_level` = `ch_skills`.`skill1`
   AND `ch_skills`.`uid` = :uid");

对于skill2:

代码语言:javascript
复制
$query = $this->db->prepare("SELECT `skills`.`skill_ID` as `Skill1_id`, 
   `skill_name`.`skill_name` as `Skill1_name`, `skill_level` as `Skill1_level`, 
   `skill_price` as `Skill1_price` 
   FROM `skills`, `skill_name`, `ch_skills` 
   WHERE `skill_name`.`skill_ID` = `skills`.`skill_ID` 
   AND `skills`.`skill_ID`= 2 
   AND `skills`.`skill_level` = `ch_skills`.`skill2`
   AND `ch_skills`.`uid` = :uid");

等等..。正如您所看到的,只有两个不同之处: skill_id = 2和skill2作为库伦的名称。在一个查询中,有什么方法可以查询所有5项技能吗?或者你会建议我改变桌子的结构吗?

注意:skills代表技能价格,skill_name代表技能名称。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-20 02:47:24

正如其他评论者所建议的那样,您的最佳选择是按照您的建议更改表。

没有像您在第一个示例中显示的那样有一个宽表的最大原因是,添加技能意味着更改数据库的结构,这可能会破坏现有的查询。

其次,正如您在试图查询结果时所看到的那样,使用单个表甚至不能使使用起来更容易。

像您的示例这样的非规范化表唯一可能的好处是它占用的磁盘空间稍微少一些。但是在今天的世界里,磁盘空间永远不应该是你最关心的问题。

但是,要回答有关查询原始非规范化示例的问题,有两种方法:

  1. 使用一个联合语句,它将5个不同的查询组合在一起。这是相当低效的
  2. 创建一个包含(在本例中)5行的表(或者如果您有技能表,请使用该表)。然后将ch_skills表加入到该表中,该表应取每一行并将其拆分5次。参见下文:(注意:就本例而言,我假设技能和skill_name处于1:1的关系中,每个只有5条记录) 选择skills.skill_IDskill_name.skill_nameskill_level as Skill_leveluid=(skills.skill_ID=1和skills.skill_level =ch_skills.d26(skills.d28=2和skills.skill_level =ch_skills<skills。skill_ID=2和skills。d30d31< skill_price >d32/code>。或(skills.skill_ID =3和skills.skill_level = ch_skills.skill3)或(skills.skill_ID =4和skills.skill_level = ch_skills.skill4) OR (skills.d46=5和skills.d48=ch_skills.d50)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25944035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档