关联查询和子查询一般是不一起用的,不过复杂场景下也会有使用,本文对此略加介绍。
场景
例如,A表是省份表,B表是城市表,C表是城市里的万达广场表,D表是万达广场里的店铺表。
现在,当前页面需要调取城市表,这个表内容要求:
每个市名左侧要挂上省名,右侧要列出该市所有的万达广场名单(不止一个广场),每个万达广场名单后面要跟上该广场的大名牌的名单。其中,每个市的万达广场和大品牌的名单合并起来写在一个单元格里。
一个典型的行是:
省 | 市 | 万达广场 |
---|---|---|
湖南 | 长沙 | A万达 老凤祥 GUCCI... B万达 老凤祥 俏江南 |
思路
万达表分别跟市表、商铺表做内关联查询,这作为一个子查询,以市表id为索引,然后,市表左关联省表得到省名,市表也左关联上面的子查询,得到万达和商铺的一揽子信息。
实现
$万达_list = Db::table('万达表')
->join('市表', '万达.市_id = 市.id')
->join('商铺表', '商铺.万达_id = 万达.id')
->field('市.id, group_concat(商铺名) AS 商铺_name,...其他想要的字段都合并)
->group('市.id')
->select(false);
重点在于:
1、上面代码先获取子查询的代码本身,select(false)表示只生成代码,不真正查询。生成的代码不带左右括号,所以下文用的时候需要带上左右括号。
2、该group_concat的group_concat,因为我们打算把万达和商铺写到一个单元格里。
$市_list = Db::table('市表')
->join('省表', '市.省_id = 省.id', 'LEFT')
->join('('.$万达_list.') as 万达别名', '市.id = 万达别名.id', 'LEFT')
->field('市.id, ...其他字段')
->select();
重点在于,将查询语句括起来,给一个别名。