【问题标题】:How can I turn ZF ->joinLeft()s into a Subquery?如何将 ZF ->joinLeft()s 转换为子查询?
【发布时间】:2013-04-26 11:02:17
【问题描述】:

我如何将下面的查询转换为子查询? 我不想使用 JOINS 我想通过子查询做同样的事情。即我需要三个连接中的三个子查询。下面的查询怎么可能?

protected $_name = 'sale_package_features';
public function getAllSalePackageFeatures(){
    $sql = $this->select()->setIntegrityCheck(false)
            ->from(array('spf' => $this->_name))
            ->joinLeft(array('sd' => 'sale_devices'),'sd.sale_device_id = spf.sale_device_id',array('sd.sale_device_name AS deviceName'))
            ->joinLeft(array('sp' => 'sale_packages'),'sp.sale_package_id = spf.sale_package_id',array('sp.sale_package_name AS packageName'))
            ->joinLeft(array('sf' => 'sale_features'),'sf.sale_feature_id = spf.sale_feature_id',array('sf.sale_feature_name AS featureName'))
            ->where('sf.parent_id != ?',0)
            ->order('spf.sale_package_feature_id ASC');
    return $sql->query()->fetchAll();
}

已编辑:

SELECT
   `spf`.*, `sd`.`sale_device_name` AS `deviceName`, 
   `sp`.`sale_package_name` AS `packageName`, 
   `sf`.`sale_feature_name` AS `featureName` 
FROM `sale_package_features` AS `spf` 
LEFT JOIN `sale_devices` AS `sd` 
  ON sd.sale_device_id = spf.sale_device_id
LEFT JOIN `sale_packages` AS `sp` 
  ON sp.sale_package_id = spf.sale_package_id 
LEFT JOIN `sale_features` AS `sf` 
  ON sf.sale_feature_id = spf.sale_feature_id 
WHERE (sf.parent_id != 0) 
ORDER BY `spf`.`sale_package_feature_id` ASC

【问题讨论】:

  • 在进行转换部分之前,如果您明确说明如何自行创建子查询,这可能是值得的,因此更清楚具体哪个部分在进行转换时遇到问题。只是一个想法。
  • 是的,“需要”部分在您的问题中非常清楚。但是“阻止你做什么”的部分不是。这就是我问的原因,也许您可​​以对此进行一些改进,这可能有助于获得答案。但只是一个建议,我对 zendframework 中的子查询一无所知。
  • 啊,好吧,所以你根本不知道如何首先使用 zend-framework 创建子查询?也许您知道纯 SQL,因此您可以展示您尝试实现的纯 SQL 示例?如果我不能提供太多帮助也很抱歉,我什至不知道在 zend-framework 中是否可以创建子查询。
  • 只是看到您的编辑,如果您不介意,我可能会建议其他评论?我看到您发布了一个包含所有这些连接的 SQL 查询。您是否也可以(即使 SQL 代码不正确)放在您正在寻找的那种子查询下方?所以很清楚你想成为子查询的哪一部分?我问是因为有三个连接,不清楚您是否想要其中的一部分或全部作为子查询,甚至是多个子查询。
  • 你可能应该在你的问题中写下来。我想说这对于一般的子查询来说并不常见,并不是说我对此有任何权威,但我认为如果你补充说你需要三个连接中的三个子查询,你的问题将因此受益。

标签: php zend-framework join subquery zend-db


【解决方案1】:

你可以使用

$dbAdapter = Zend_Db_Table::getDefaultAdapter();
$subSelect = $dbAdapter
    ->select()
    ->from( 'tablename',
        array(
            'col1_alias' => 'column1_name',
            'col2_alias' => 'column2_name',
        ))
    ->where('somefield = ?', $value_to_be_quoted);

$select = $dbAdapter
    ->select()
    ->from(array('sub_alias' => $subSelect ))
    ->where('otherfield = ?', $other_value_to_be_quoted);

$sql = $select->assemble();

$sql 将包含

SELECT 
    sub_alias . *
FROM
    (SELECT 
        tablename.column1_name AS col1_alias,
            tablename.column2_name AS col2_alias
    FROM
        tablename
    WHERE
        (somefield = 'quoted_value')) AS sub_alias
WHERE
    (otherfield = 'quoted_other_value')

如果您需要使用 SELECT .. WHERE x IN (subselect) 而不是使用

$select->where( 'column IN (?)', new Zend_Db_Expr($subselect->assemble()) );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    • 2021-06-23
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多