ThinkPHP查询结果内的查询

129 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

select ...( select ...)...形式的SQL封装

我想要一个这样的SQL分页查询:

SELECT
	TEMPTABLE .aid,
	TEMPTABLE .aliid,
	TEMPTABLE .etime,
	TEMPTABLE .end_time,
	TEMPTABLE .endtime
FROM
	`sd_o_agreement` `ag`
LEFT JOIN (
	SELECT
		sa.id AS aid,
		`sa`.`starttime`,
		`sa`.`endtime`,
		sali.id AS aliid,
		sal.id AS alid,
		`sal`.`start_time`,
		`sal`.`end_time`,
		CASE
	WHEN isnull(sal.end_time) THEN
		sa.endtime
	ELSE
		sal.end_time
	END etime
	FROM
		`sd_o_agreement` `sa`
	LEFT JOIN `sd_o_agreement_list_info` `sali` ON `sali`.`agreement_id` = `sa`.`id`
	LEFT JOIN `sd_o_agreement_list` `sal` ON `sali`.`agreement_list_id` = `sal`.`id`
	GROUP BY
		`sa`.`id`
	ORDER BY
		etime DESC
) TEMPTABLE ON `tempTable`.`aid` = `ag`.`id`
WHERE
	(etime < '1618796943')
LIMIT 0,
 10

首先先做内部sql的查询封装:

内部查询的字段:

  $field = "	sa.id as aid,
        `sa`.`starttime`,
        `sa`.`endtime`,
        sali.id AS aliid,
        sal.id AS alid,
        `sal`.`start_time`,
        `sal`.`end_time`,
           CASE
            WHEN isnull(sal.end_time) THEN
                sa.endtime
            ELSE
                sal.end_time
            END
            etime";

内部sql的联查:

        $join = [
            [ 'sd_o_agreement_list_info sali', 'sali.agreement_id = sa.id','LEFT'],
            [ 'sd_o_agreement_list sal', 'sali.agreement_list_id = sal.id','LEFT'],
        ];

然后我们把内部查询的sql生成出来:

        $tempTableSql = $this->alias("sa")
            ->field($field)
            ->join($join)
            ->group("sa.id")
            ->order("etime desc")
            ->select(false);

然后开始封装我们最后的sql: 封装查询字段:

 $newField = ["tempTable.aid,tempTable.aliid,tempTable.etime,tempTable.end_time,tempTable.endtime"];

关键性操作在这里了,【敲黑板】 联查封装:

    $newJoin = [
        [ '('.$tempTableSql.' ) tempTable', '  tempTable.aid = ag.id','LEFT']
    ];

说明:如正常我们写联查对应关系一样。注意点是:之前写表名字的位置,放置上我们开始生成的临时sql,并且它的前后需要被‘(’、‘)’包起来,后面给他起别名,其他按照正常对应关系写即可!

后封装我们的查询语句:

        $list = $this->alias("ag")
            ->field($newField)
            ->where($where)
            ->join($newJoin)
            ->paginate(10);
        echo $this->getLastSql()."<br>";exit;

拼接一个mybatis:

<resultMap type="io.renren.modules.generator.entity.TEsintSjxxBpcclxxbEntity" id="tEsintSjxxBpcclxxbMap">
        <result property="bqmc" column="BQMC"/>
        <result property="bqxxsj" column="BQXXSJ"/>
        <result property="bz" column="BZ"/>
        <result property="clpp" column="CLPP"/>
        <result property="clsbdh" column="CLSBDH"/>
        <result property="csys" column="CSYS"/>
        <result property="hphm" column="HPHM"/>
        <result property="hpzl" column="HPZL"/>
        <result property="id" column="ID"/>
        <result property="industrialid" column="INDUSTRIALID"/>
        <result property="jdcsyr" column="JDCSYR"/>
        <result property="jdcsyrsfzh" column="JDCSYRSFZH"/>
        <result property="kkhchrlx" column="KKHCHRLX"/>
        <result property="kkid" column="KKID"/>
        <result property="kklx" column="KKLX"/>
        <result property="kkmc" column="KKMC"/>
        <result property="kksfsz" column="KKSFSZ"/>
        <result property="kkssdszdm" column="KKSSDSZDM"/>
        <result property="kkssdszmc" column="KKSSDSZMC"/>
        <result property="kkssdwdm" column="KKSSDWDM"/>
        <result property="kkssdwmc" column="KKSSDWMC"/>
        <result property="kkssfsxdm" column="KKSSFSXDM"/>
        <result property="kkssfsxmc" column="KKSSFSXMC"/>
        <result property="kkszmc" column="KKSZMC"/>
        <result property="kkxzqh" column="KKXZQH"/>
        <result property="pccljg" column="PCCLJG"/>
        <result property="pccljgmc" column="PCCLJGMC"/>
        <result property="pcclyjdw" column="PCCLYJDW"/>
        <result property="pcclyjyy" column="PCCLYJYY"/>
        <result property="pcdjd" column="PCDJD"/>
        <result property="pcdwd" column="PCDWD"/>
        <result property="pcsj" column="PCSJ"/>
        <result property="pcsrlx" column="PCSRLX"/>
        <result property="sjly" column="SJLY"/>
        <result property="ssdszdm" column="SSDSZDM"/>
        <result property="ssdszmc" column="SSDSZMC"/>
        <result property="ssdwdm" column="SSDWDM"/>
        <result property="ssdwdycs" column="SSDWDYCS"/>
        <result property="ssdwmc" column="SSDWMC"/>
        <result property="ssfsxdm" column="SSFSXDM"/>
        <result property="ssfsxmc" column="SSFSXMC"/>
        <result property="userid" column="USERID"/>
        <result property="username" column="USERNAME"/>
        <result property="xtCjsj" column="XT_CJSJ"/>
        <result property="xtLrip" column="XT_LRIP"/>
        <result property="xtLrrbm" column="XT_LRRBM"/>
        <result property="xtLrrbmid" column="XT_LRRBMID"/>
        <result property="xtLrrid" column="XT_LRRID"/>
        <result property="xtLrrxm" column="XT_LRRXM"/>
        <result property="xtLrsj" column="XT_LRSJ"/>
        <result property="xtZhxgip" column="XT_ZHXGIP"/>
        <result property="xtZhxgrbm" column="XT_ZHXGRBM"/>
        <result property="xtZhxgrbmid" column="XT_ZHXGRBMID"/>
        <result property="xtZhxgrid" column="XT_ZHXGRID"/>
        <result property="xtZhxgrxm" column="XT_ZHXGRXM"/>
        <result property="xtZhxgsj" column="XT_ZHXGSJ"/>
        <result property="xtZxbz" column="XT_ZXBZ"/>
        <result property="xtZxyy" column="XT_ZXYY"/>
        <result property="ywid" column="YWID"/>
        <result property="ywkzzd1" column="YWKZZD1"/>
        <result property="ywkzzd2" column="YWKZZD2"/>
        <result property="ywkzzd3" column="YWKZZD3"/>
        <result property="ywkzzd4" column="YWKZZD4"/>
        <result property="ywkzzd5" column="YWKZZD5"/>
        <result property="ywlx" column="YWLX"/>
        <result property="zdch" column="ZDCH"/>
        <result property="zdsim" column="ZDSIM"/>
        <result property="zdxh" column="ZDXH"/>
        <result property="rksjZyk" column="RKSJ_ZYK"/>
        <result property="source" column="SOURCE"/>
        <result property="esintInsertTime" column="ESINT_INSERT_TIME"/>
        <result property="sourceInfo" column="SOURCE_INFO"/>
    </resultMap>