【问题标题】:TYPO3: How convert SQL statement into typo3 PDOTYPO3:如何将 SQL 语句转换为 Typo3 PDO
【发布时间】:2020-12-08 17:13:23
【问题描述】:

当我尝试在 TYPO3 上使用“queryBuilder”实现时,我遇到了 SQL(子查询)语句的问题。请你帮我解决这个问题(将 SQL 语句转换为 TYPO3 "queryBuilder")。谢谢!

SQL 语句:

SELECT * FROM table_1 AS t1
INNER JOIN table_2 AS t2 ON t1.id = t2.id
WHERE t2.date = (SELECT MAX(date) FROM t2 AS t2_Tmp WHERE t2_Tmp.id = t2.id)

我尝试使用此代码(示例):

$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
        ->getQueryBuilderForTable('table2');

return $queryBuilder->select('*')
->from('table2')
->innerJoin(
   'table2',
   'table1',
   't1',
   $queryBuilder->expr()->eq('t1.id', $queryBuilder->quoteIdentifier('t2.id'))
)
->where(
    $queryBuilder->expr()->eq('t2.date',
        $queryBuilder->addSelectLiteral($queryBuilder->expr()->max('t2.date', 'date'))
            ->from('t2','t2_tmp')
            ->where($queryBuilder->expr()->eq('t2_tmp.id', $queryBuilder->quoteIdentifier('t2.id')))
    )
)
->execute()
->fetchAll();

【问题讨论】:

  • 那么到目前为止你尝试了什么?你到底在哪里挣扎?
  • 可以看我的代码示例
  • 具体的错误信息是什么?

标签: typo3 typo3-9.x


【解决方案1】:

我想你可以试试这样的:

$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
        ->getQueryBuilderForTable('table2');

return $queryBuilder->select('*')
->from('table1', 't1')
->innerJoin(
   't1',
   'table2',
   't2',
   $queryBuilder->expr()->eq('t1.id', $queryBuilder->quoteIdentifier('t2.id'))
)
->where(
    $queryBuilder->expr()->eq('t2.date',
        $queryBuilder->addSelectLiteral("(SELECT MAX(date) FROM t2 AS t2_Tmp WHERE t2_Tmp.id = t2.id)")
    )
)
->execute()
->fetchAll();

【讨论】:

    【解决方案2】:

    我为这个案例找到了解决方案并为我工作。

    $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('table1');
    $subQueryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('table2');
    
    $queryBuilder->select('*')
            ->from('table1', 't1')
            ->innerJoin(
                't1',
                'table2',
                't2',
                $queryBuilder->expr()->eq('t2.t1_uid', $queryBuilder->quoteIdentifier('t1.uid')))
            ->where(
                $queryBuilder->expr()->eq('t2.date', '(' . $subQueryBuilder->addSelectLiteral(
                    "MAX(date) FROM t2 AS t2_tmp WHERE t2_tmp.t1_uid = t2.t1_uid"
                    ) . ')'
                )
            )
            ->execute()
            ->fetchAll();
    

    【讨论】:

      猜你喜欢
      • 2013-08-11
      • 1970-01-01
      • 1970-01-01
      • 2020-07-19
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 2017-10-06
      相关资源
      最近更新 更多