假如有一张分类表,结构:
CREATE TABLE `good_category` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`pid` int(11) NOT NULL DEFAULT '0' COMMENT '父类id',
`cate_name` varchar(100) NOT NULL COMMENT '分类名称',
`cate_order` varchar(100) NOT NULL COMMENT '同级分类下分类的显示顺序',
`add_time` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;
有一张商品表,结构:
CREATE TABLE `good` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`cate_id` int(11) NOT NULL COMMENT '商品分类',
`name` varchar(200) NOT NULL COMMENT '商品名称',
`price` decimal(12,2) NOT NULL COMMENT '商品价格',
`origin_price` decimal(12,2) NOT NULL COMMENT '商品原价',
`image` varchar(200) NOT NULL COMMENT '商品图片',
`detail` text NOT NULL COMMENT '商品详情',
`sort` int(11) NOT NULL COMMENT '商品排序',
`status` tinyint(1) NOT NULL COMMENT '是否下架 0表示下架,1表示上架',
`add_time` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
再获取商品的同时获取商品的分类名称,有两种方式:
方法1:先获取所有得商品,然后获得商品对应的分类,下面是伪代码
$goods = select * from goods
foreach ($goods ad $good){
$goods['cat_name'] = select * from good_category where id = $good[cat_id]
}
方法2:直接连接查询获取商品的分类
$goods = select * from good, good_category where good.cate_id = good_category.id
请问这两种查询方式,哪种查询方式比较好?
方法2更好。
你可以在mysql 里面尝试一下explain。
以下是我的分析数据(数据是自己加上的)
+----+-------------+-------+--------+---------------+---------+---------+-------------+------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows |
+----+-------------+-------+--------+---------------+---------+---------+-------------+-----
| 1 | SIMPLE | e | ALL | NULL | NULL | NULL | NULL | 769 |
| 1 | SIMPLE | u | eq_ref | PRIMARY | PRIMARY | 4 | lvshi.e.uid | 1 |
+----+-------------+-------+--------+---------------+---------+---------+-------------+-----
一共要扫描769行
+----+-------------+---------+------+---------------+------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+------+---------------+------+---------+------+------+-------+
| 1 | SIMPLE | ez_case | ALL | NULL | NULL | NULL | NULL | 769 | |
+----+-------------+---------+------+---------------+------+---------+------+------+-------+
也扫描769行
所以说 是否join,不会影响扫描的数量
如果你是用方法一的话,就有多了一步php操作没有必要。