<?php
/*
燕十八 公益PHP培训
课堂地址:YY频道88354001
学习社区:www.zixue.it
<1>:Mysql中的左连接.
select 字段1,字段2,字段3 from tableA left join tableB on tableA.字段1=tableB.字段1;
将表A 和表B 两张表连接起来 查询两张表中所有的字段 当两张表中的字段同时都有的时候,前面加上表的名称如:table.字段来区别;
实例1:
a:goods表
+--------+---------------------+------------+
| cat_id | goods_name | shop_price |
+--------+---------------------+------------+
| 4 | KD876 | 1388.00 |
| 8 | 诺基亚N85原装充电器 | 58.00 |
| 8 | 诺基亚原装5800耳机 | 68.00 |
| 11 | 索爱原装M2卡读卡器 | 20.00 |
| 11 | 胜创KINGMAX内存卡 | 42.00 |
+--------+---------------------+------------+
b:category表
+--------+-------------------+
| cat_id | cat_name |
+--------+-------------------+
| 1 | 手机类型 |
| 2 | CDMA手机 |
| 3 | GSM手机 |
| 4 | 3G手机 |
| 5 | 双模手机 |
| 6 | 手机配件 |
| 7 | 充电器 |
| 8 | 耳机 |
| 9 | 电池 |
| 11 | 读卡器和内存卡 |
| 12 | 充值卡 |
| 13 | 小灵通/固话充值卡 |
| 14 | 移动手机充值卡 |
| 15 | 联通手机充值卡 |
+--------+-------------------+
根据cat_id 取到商品的所属分类 结果如下
+--------+---------------------+----------------+
| cat_id | goods_name | cat_name |
+--------+---------------------+----------------+
| 4 | KD876 | 3G手机 |
| 8 | 诺基亚N85原装充电器 | 耳机 |
| 8 | 诺基亚原装5800耳机 | 耳机 |
| 11 | 索爱原装M2卡读卡器 | 读卡器和内存卡 |
| 11 | 胜创KINGMAX内存卡 | 读卡器和内存卡 |
+--------+---------------------+----------------+
实现语句为:
select goods.cat_id,goods_name,cat_name from goods left join category ongoods.cat_id=category.cat_id;
<2>:Mysql中的有连接.
select 字段1,字段2,字段3 from tableA right join tableB on tableA.字段1=tableB.字段1;
原理和左连接完全相同,不同的是参照标准不同,左连接,是以左边的表为标准,然后连接表逐一与之匹配而有链接则是以右表为标准,左边与之相配.
tableA left join tableB <==> tableB right join tableA;//两条语句等价.
同<1> 右连接实现语句:
select goods.cat_id,goods_name,cat_name from category right join goods ongoods.cat_id=category.cat_id;
<3>Mysql中的union
(select 字段1,字段2,字段3 from tableA)
union
(select 字段4,字段5,字段6 from tableB);
union是将两张表的结果联合起来合并.结果集的字段以第一条语句的字段为准.
union的结果集是去重复的,如果结果集不需要去重复,可以选用union all.
实例:
A表:
+------+------+
| id | num |
+------+------+
| a | 5 |
| b | 10 |
| c | 15 |
| d | 10 |
+------+------+
B表:
+------+------+
| id | num |
+------+------+
| b | 5 |
| c | 15 |
| d | 20 |
| e | 99 |
+------+------+
要求结果:
要求查询出以下效果:
+------+----------+
| id | sum(num) |
+------+----------+
| a | 5 |
| b | 15 |
| c | 30 |
| d | 30 |
| e | 99 |
+------+----------+
解释:就是将a表里的数据如id为a的值5 与b表里的id为a的值相加,如果b表没有id为a的数据,则就以a表里的数据为准.
思路:先将两张表连起来.
(select * from a) union (select * from b);
+------+------+
| id | num |
+------+------+
| a | 5 |
| d | 10 |
| c | 15 |
| b | 10 |
| d | 20 |
| e | 99 |
| b | 5 |
+------+------+
在将数据分组即可:
select id,sum(num) from ((select * from a) union (select * from b))as temp group by id;
+------+----------+
| id | sum(num) |
+------+----------+
| a | 5 |
| b | 15 |
| c | 15 |
| d | 30 |
| e | 99 |
+------+----------+
发现结果不对,是因为联合的时候去掉重复的了为了不去重复:可以用union all;
select id,sum(num) from ((select * from a) union all (select * from b))as temp group by id;
结果:
+------+----------+
| id | sum(num) |
+------+----------+
| a | 5 |
| b | 15 |
| c | 30 |
| d | 30 |
| e | 99 |
+------+----------+