最近由于找工作,所以在恶补PHP和Mysql方面的东西,发现还是学习的不够。这几天看到关于mysql的交叉表查询的内容,根据自己的理解简单的尝试了下。
由于MonsterHunter World较火,就拿怪物做个例子吧。
首先建立张怪物信息表:
CREATE TABLE `monster_info` (
`monster` varchar(16) DEFAULT NULL COMMENT '怪物名称',
`position` varchar(8) DEFAULT NULL COMMENT '怪物部位',
`damage` mediumint(4) DEFAULT NULL COMMENT '部位耐性,所能承受的伤害'
) ENGINE=InnoDB DEFAULT CHARSET=utf8
然后我们插入四个古龙数据(数据当然是我自己编的),请勿参考。
INSERT INTO `monster_info` VALUES ('灭尽龙', '前爪', '300'),
('灭尽龙', '后爪', '350'),
('灭尽龙', '尾巴', '500'),
('灭尽龙', '头', '500'),
('钢龙', '前爪', '270'),
('钢龙', '后爪', '350'),
('钢龙', '尾巴', '450'),
('钢龙', '头', '550'),
('炎王龙', '前爪', '300'),
('炎王龙', '后爪', '320'),
('炎王龙', '尾巴', '480'),
('炎王龙', '头', '500'),
('尸套龙', '头', '360'),
('尸套龙', '前爪', '260'),
('尸套龙', '后爪', '240'),
('尸套龙', '尾巴', '430');
OK插入完成后让我们看下整张表:
SELECT * FROM monster_info;
以下是查询结果:
+-----------+----------+--------+
| monster | position | damage |
+-----------+----------+--------+
| 灭尽龙 | 前爪 | 300 |
| 灭尽龙 | 后爪 | 350 |
| 灭尽龙 | 尾巴 | 500 |
| 灭尽龙 | 头 | 500 |
| 钢龙 | 前爪 | 270 |
| 钢龙 | 后爪 | 350 |
| 钢龙 | 尾巴 | 450 |
| 钢龙 | 头 | 550 |
| 炎王龙 | 前爪 | 300 |
| 炎王龙 | 后爪 | 320 |
| 炎王龙 | 尾巴 | 480 |
| 炎王龙 | 头 | 500 |
| 尸套龙 | 头 | 360 |
| 尸套龙 | 前爪 | 260 |
| 尸套龙 | 后爪 | 240 |
| 尸套龙 | 尾巴 | 430 |
+-----------+----------+--------+
16 rows in set (0.00 sec)
根据交叉表查询,那我们所需要的列不再是position,damage。而是相应的前爪,后爪等分类。那如何才能获取前爪等相应分类呢?这里我们可以使用Mysql的IF函数来进行处理。IF函数接收三个参数,个人理解类似有点三元运算符,举个例子:
SELECT IF(1 > 0, 'A', 'B');
+---------------------+
| IF(1 > 0, 'A', 'B') |
+---------------------+
| A |
+---------------------+
1 row in set (0.00 sec)
由此我们可以通过判断不同的position来生成相应的列,先来尝试获取position=头的damage值:
SELECT monster, IF(position="头", damage, 0) as "头" FROM monster_info;
查询结果为:
+-----------+------+
| monster | 头 |
+-----------+------+
| 灭尽龙 | 0 |
| 灭尽龙 | 0 |
| 灭尽龙 | 0 |
| 灭尽龙 | 500 |
| 钢龙 | 0 |
| 钢龙 | 0 |
| 钢龙 | 0 |
| 钢龙 | 550 |
| 炎王龙 | 0 |
| 炎王龙 | 0 |
| 炎王龙 | 0 |
| 炎王龙 | 500 |
| 尸套龙 | 360 |
| 尸套龙 | 0 |
| 尸套龙 | 0 |
| 尸套龙 | 0 |
+-----------+------+
16 rows in set (0.00 sec)
OK,我们获取了相应的部位,由于SQL条件判断position="头",所以其他非头部的值默认给0的值,那如何去掉0值呢?这里可以使用SUM()函数加上group by来处理:
SELECT monster, SUM(IF(position="头", damage, 0)) as "头" FROM monster_info GROUP BY monster;
查询结果:
+-----------+------+
| monster | 头 |
+-----------+------+
| 尸套龙 | 360 |
| 灭尽龙 | 500 |
| 炎王龙 | 500 |
| 钢龙 | 550 |
+-----------+------+
4 rows in set (0.00 sec)
既然获取所有头部的伤害,那依样画瓢把其他的列也进行SUM处理就能获取相应的部位伤害了。
以上只是单表简单的查询,实际上表设计不会如此,以后继续学习联表的交叉查询。