首页 > 解决方案 > TYPO3:如何将 SQL 语句转换为 Typo3 PDO

问题描述

当我尝试在TYPO3使用“queryBuilder”实现时,我遇到了 SQL(subqueries) 语句的问题。请你帮我解决这个问题(将 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();

标签: typo3typo3-9.x

解决方案


我为这种情况找到了解决方案并为我工作。

$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();

推荐阅读