Zend的\\ Db的:从子查询选择(Zend\\Db: Select from subquery)

2019-10-30 11:26发布

我移植从ZF1应用程序ZF2和的那部分我不得不重写我们的数据库映射器。

我与这条SQL语句挣扎:

SELECT full_name, GROUP_CONCAT(value)
FROM (
   SELECT full_name, value
   FROM my_table
   ORDER BY id DESC
   ) as subtable
GROUP BY full_name
ORDER BY full_name DESC;

我试图解决的根本问题是,我需要在运行之前订购的子查询的结果GROUP_CONCAT ,我需要它为MySQL和SQLite的工作。 在MySQL中我可以简单地指定范围内的顺序GROUP_CONCAT功能,但是这是不可能的使用SQLite,所以我需要的子查询它是与MySQL和SQLite的兼容。

在ZF1我可以这样做:

$fromSql = $db->select()
              ->from('my_table', array('full_name', 'value'))
              ->order('id DESC');

$sql = $db->select()
          ->from(array(
                'subtable' => new Zend_Db_Expr('(' . $fromSql . ')')
            ), array(
                'full_name' => 'full_name',
                'value' => new Zend_Db_Expr('GROUP_CONCAT(subtable.value)'),
            )
          )
          ->group('full_name')
          ->order('full_name DESC');

然而,在使用子查询from子句似乎并不可能与ZF2。 有一些变通方法吗?

Answer 1:

编辑 :其实,我现在看到我的查询是有缺陷的。 如使用MySQL,这意味着我仍然需要编写专门的查询,预计这将无法正常工作。 见GROUP_CONCAT变化GROUP BY秩序


通过的代码会后Zend\Db\Sql\Select ,我发现这几行:

if ($table instanceof Select) {
    $table = '(' . $this->processSubselect($table, $platform, $driver, $parameterContainer) . ')';
} else {
    $table = $platform->quoteIdentifier($table);
}

因此,答案其实很简单,所有我所要做的就是提供一个Zend\Db\Sql\Select对象from()没有它包裹在Zend\Db\Sql\Expression不像我以前用ZF1。

代码示例:

$adapter = $this->getAdapter(); // Returns Zend\Db\Adapter\Adapter
$sql = new Zend\Db\Sql\Sql($adapter);

$from = $sql->select()
    ->from(static::$table)
    ->columns(array(
        'full_name',
        'value',
    ))
    ->order('id DESC');

$select = $sql->select()
    ->from(array(
        'subtable' => $from,
    ))
    ->columns(array(
        'full_name' => 'full_name',
        'value' => new Expression('GROUP_CONCAT(value)'),
    ))
    ->group('full_name')
    ->order('full_name DESC');

$selectString = $sql->getSqlStringForSqlObject($select);

$resultSet = $adapter->query($selectString, $adapter::QUERY_MODE_EXECUTE);

return $resultSet->toArray();


文章来源: Zend\\Db: Select from subquery