美文网首页
ThinkPHP实现关联子查询

ThinkPHP实现关联子查询

作者: microkof | 来源:发表于2017-07-26 15:56 被阅读185次

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

场景

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

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

相关文章

  • ThinkPHP实现关联子查询

    关联查询和子查询一般是不一起用的,不过复杂场景下也会有使用,本文对此略加介绍。 场景 例如,A表是省份表,B表是城...

  • 第六章 查询性能优化(下)

    MySQL查询优化器的局限性 关联子查询 MySQL的关联子查询实现的很差,最好改成左外连接(LEFT OUTER...

  • ThinkPHP数据查询与添加语句

    在ThinkPHP框架中实现数据的查询操作 在ThinkPHP框架中实现数据的添加操作

  • 查询性能优化

    MySQL查询优化器的局限性 关联子查询 MySQL的子查询实现的非常糟糕,最糟糕的一类查询是where条件中包含...

  • thinkphp子查询

    1.根据实际情况发现子查询用->buildSql();

  • SQL必知必会(子查询)

    一、什么是关联子查询,什么是非关联子查询 子查询虽然是一种嵌套查询的形式,不过我们依然可以依据子查询是否执行多次,...

  • 数据库笔记-SQL子查询

    子查询:关联查询和非关联查询 子查询是「查询」中的「查询」,就是「嵌套查询」。 以 NBA 的SQL数据库文件为例...

  • 关联子查询和非关联子查询

    对于exist和in,大家的一致看法如下:1.in是子查询为驱动表,外面的表为被驱动表,故适用于子查询结果集小而外...

  • 一文详解 SQL 关联子查询

    本文主要介绍什么是关联子查询以及如何将关联子查询改写为普通语义的sql查询。 在背景介绍中我们将讲讲常见的关联子查...

  • SQL关联子查询

    简单易懂教你学会SQL关联子查询 初学SQL的人都会觉得SQL的关联子查询难以理解,为什么?这是有原因的。 关联子...

网友评论

      本文标题:ThinkPHP实现关联子查询

      本文链接:https://www.haomeiwen.com/subject/vaqokxtx.html