ThinkPHP实现关联子查询

2017-07-26  本文已影响185人  microkof

关联查询和子查询一般是不一起用的,不过复杂场景下也会有使用,本文对此略加介绍。

场景

例如,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();

重点在于,将查询语句括起来,给一个别名。

上一篇 下一篇

猜你喜欢

热点阅读