我的ch_skills表看起来像
uid | skill1 | skill2 | skill3 | skill4 | skill5
1 1 2 2 0 1
2 1 1 2 1 1
3 1 2 3 0 1我的第一个问题:这是对的吗?我是说,如果我这样做会更好吗?
uid | skillid | skill_lvl
1 1 1
1 2 2
1 3 2
1 4 0
1 5 1到目前为止,示例1的所有操作都很好,但是现在我在sql查询方面遇到了麻烦。目前,我正在使用5种不同的查询来获取每种技能的级别。我使用以下代码:
对于skill1:
$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:
$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代表技能名称。
发布于 2014-09-20 02:47:24
正如其他评论者所建议的那样,您的最佳选择是按照您的建议更改表。
没有像您在第一个示例中显示的那样有一个宽表的最大原因是,添加技能意味着更改数据库的结构,这可能会破坏现有的查询。
其次,正如您在试图查询结果时所看到的那样,使用单个表甚至不能使使用起来更容易。
像您的示例这样的非规范化表唯一可能的好处是它占用的磁盘空间稍微少一些。但是在今天的世界里,磁盘空间永远不应该是你最关心的问题。
但是,要回答有关查询原始非规范化示例的问题,有两种方法:
skills.skill_ID,skill_name.skill_name,skill_level as Skill_level,uid=(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)https://stackoverflow.com/questions/25944035
复制相似问题