mysql - Zend\Db : Select from subquery

标签 mysql sqlite zend-framework2 zend-db

我正在将一个应用程序从 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');

但是,ZF2 似乎无法在 from 子句中使用子查询。有一些解决办法吗?

最佳答案

编辑:实际上,我现在发现我的查询存在缺陷。它不会像预期的那样与 MySQL 一起工作,这意味着我仍然必须编写专门的查询。参见 GROUP_CONCAT change GROUP BY order


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

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

所以答案实际上很简单,我所要做的就是向 from() 提供一个 Zend\Db\Sql\Select 对象,而不用包装它在 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();

关于mysql - Zend\Db : Select from subquery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25606544/

相关文章:

c# - SQL 本地网络连接字符串

android - 在 Android SQLite 中从哪里获取数据库错误信息(例如,由于违反 not null 而导致插入失败)

php - Zend Framework 2 session 生命周期

php - 带有 ascii 图标的文本的 Mysql 列类型

zend-framework2 - Zend Framework 2 教程 : Module (Application) could not be initialized

mysql - mysql中的运行平均值

MySQL 在 --batch 模式下处理空值

python - 使用 Pandas 与 MySQL 读取巨大的 CSV 文件

qt - 将外部SQLite数据库导入我的项目

ruby-on-rails - 为什么ActiveRecord::StatementInvalid:SQLite3::SQLException:在“)附近:语法错误:INSERT INTO“user_friendships”()VALUES()