#typo3 #typo3-9.x
#typo3 #typo3-9.x
Вопрос:
У меня возникла проблема с оператором SQL (подзапросы), когда я пытаюсь реализовать с помощью «QueryBuilder» в TYPO3. Пожалуйста, не могли бы вы помочь мне в этом случае (преобразовать SQL statament в 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();
Комментарии:
1. Итак, что вы пробовали до сих пор? Где именно вы боретесь?
2. Вы можете увидеть мой пример кода
3. И каково точное сообщение об ошибке?
Ответ №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();