如何在 zend db 上构建嵌套选择 [英] how to build nested select on zend db

查看:37
本文介绍了如何在 zend db 上构建嵌套选择的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这个查询有问题

SELECT * FROM(
    SELECT `b`.*,`owner`.firstname,`owner`.lastname,`owner`.email,
    (
        SELECT COUNT(`ps`.profile_id)   FROM `profile` AS `ps`
        LEFT JOIN `xref_store_profile_brand` AS `xbp` ON `xbp`.profile_id = `ps`.profile_id
        WHERE `xbp`.brand_id = b.brand_id AND ps.role = 'salesrep' AND `xbp`.store_id IS NULL
    ) AS `salesrepTotal`,
    (
        SELECT GROUP_CONCAT(`ms`.firstname)   FROM `profile` AS `ps`
        LEFT JOIN `xref_store_profile_brand` AS `xbp` ON `xbp`.profile_id = `ps`.profile_id
        LEFT JOIN `member` AS `ms`ON `ms`.member_id = `ps`.member_id
        WHERE `xbp`.brand_id = `b`.brand_id AND ps.role = 'salesrep' AND `xbp`.store_id IS NULL
    ) AS `salesrep`,
    (
        SELECT COUNT(`s`.store_id) FROM `store` AS `s`
        LEFT JOIN `xref_store_profile_brand` AS `xbs` ON `xbs`.store_id = `s`.store_id
        WHERE `xbs`.brand_id = `b`.brand_id AND `xbs`.brand_id IS NOT NULL
    ) AS `storeTotal`,
    (
        SELECT GROUP_CONCAT(`s`.name) FROM `store` AS `s`
        LEFT JOIN `xref_store_profile_brand` AS `xbs` ON `xbs`.store_id = `s`.store_id
        WHERE `xbs`.brand_id = `b`.brand_id AND `xbs`.brand_id IS NOT NULL
    ) AS `store`

    FROM `brand` AS `b`
    LEFT JOIN
    (
        SELECT `m`.firstname,`m`.lastname,`m`.email,`xspb`.brand_id FROM `member` AS `m`
        LEFT JOIN `profile` as `p` ON `p`.member_id = `m`.member_id AND `p`.role = 'designer' AND `p`.isPrimary = 1
        LEFT JOIN `xref_store_profile_brand` AS `xspb` ON `xspb`.profile_id = `p`.profile_id AND `xspb`.store_id IS NULL
    ) AS `owner` ON `owner`.brand_id =`b`.brand_id

    GROUP BY `b`.brand_id
) AS `final`

如何将其转换为 Zend_Db_Select 对象?

how can i convert this in to Zend_Db_Select object?

主要问题是这部分

SELECT `b`.*,`owner`.firstname,`owner`.lastname,`owner`.email,
    (
        SELECT COUNT(`ps`.profile_id)   FROM `profile` AS `ps`
        LEFT JOIN `xref_store_profile_brand` AS `xbp` ON `xbp`.profile_id = `ps`.profile_id
        WHERE `xbp`.brand_id = b.brand_id AND ps.role = 'salesrep' AND `xbp`.store_id IS NULL
    ) AS `salesrepTotal`,

推荐答案

您需要使用 Zend_Db_Expr 对象在您的查询和 选择 AS 的数组结构.

You need to use Zend_Db_Expr objects in your query and array structures for select AS.

以下是您正在寻找的解决方案:

below is the solution you are looking for:

<?php

$db = Zend_Db_Table::getDefaultAdapter();

//  inner query
$sqlSalesRepTotal = $db->select()
        ->from(array('ps' => 'profile'))
        ->joinLeft(array('xbp' => 'xref_store_profile_brand'), 'xbp.profile_id = ps.profile_id')
        ->where('xbp.brand_id = b.brand_id')
        ->where('ps.role = ?', 'salesrep')
        ->where('xbp.store_id IS NULL');

//  main query
$sql = $db->select()
        ->from(array('b' => 'brand'), array(
            //  NOTE: have to add parentesis around the expression
            'salesrepTotal' => new Zend_Db_Expr("($sqlSalesRepTotal)")
        ))
        ->where('....')
        ->group('brand_id');


//  debug
var_dump($db->fetchAll($sql));

这篇关于如何在 zend db 上构建嵌套选择的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆