typo3 - TYPO3 QueryBuilder - 如何查找用户的最新记录?
问题描述
这是一个非常明显的数据问题,但我在任何地方都找不到简单的解决方案。
使用 TYPO3 QueryBuilder,如何从每个用户有多个条目的表中为每个用户选择最近的条目?
uid user_id value crdate
1 1 0 123456
2 1 1 123400
3 2 1 123356
4 2 0 123300
我已经尝试了许多原始 SQL 方法,并最终找到了一种基于此解决方案的有效方法 - 如何在 SQL 中的另一列中选择具有 MAX(列值)、DISTINCT 的行?
SELECT *
FROM `tx_tablename` AS `tt`
INNER JOIN (
SELECT `uid`, `user_id`, MAX(`crdate`) AS `MaxDateTime`
FROM `tx_tablename`
GROUP BY `user_id`
) AS `groupedtt`
ON `tt`.`user_id` = `groupedtt`.`user_id`
AND `tt`.`crdate` = `groupedtt`.`MaxDateTime`
WHERE `tt`.`consent_content` = 3
但是我看不到如何在 QueryBuilder 中重现这一点,因为 ->join() 语句只接受表名作为参数,而不接受 SQL,并且 ->join() 只接受一个连接条件,而不是两个。
有没有其他人找到适用于 QueryBuilder 的解决方案?非常感谢
解决方案
引用是在 TYPO3 QueryBuilder 中完成的。您可以直接使用 ConcreteQueryBuilder 绕过它。
但是这样做,你必须自己引用标识符,否则会抛出异常。
这应该可以在您的伪代码中解决问题:
use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Utility\GeneralUtility;
...
$subQueryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
->getQueryBuilderForTable('tx_tablename');
$subQuery = $subQueryBuilder
->select('uid', 'user_id')
->from('tx_tablename')
->addSelectLiteral(
$subQueryBuilder->expr()->max('crdate', 'max_crdate')
)
->groupBy('user_id');
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
->getQueryBuilderForTable('tx_tablename');
$queryResult = $queryBuilder
->select('a.*')
->from('tx_tablename', 'a')
;
$queryBuilder
->getConcreteQueryBuilder()
->innerJoin(
$queryBuilder->quoteIdentifier('a'), // !!! important, quote identifier yourself
'(' . $subQuery->getSQL() . ')',
$queryBuilder->quoteIdentifier('b'), // !!! important, quote identifier yourself
$queryBuilder->expr()->andX(
$queryBuilder->expr()->eq('a.user_id', $queryBuilder->quoteIdentifier('b.user_id')),
$queryBuilder->expr()->eq('a.crdate', $queryBuilder->quoteIdentifier('b.max_crdate'))
) // andX()
) // innerJoin()
;
$queryResult = $queryBuilder->execute();
编辑 1
固定代码示例。需要quoteIdentifier()
而不是createNamedParam()
.
笔记
如果您使用嵌套选择/子选择 AND 使用命名参数,则必须使用最外层的 queryBuilder 实例来创建命名参数,而不是当前级别的 queryBuilder。
推荐阅读
- python - 如何在元掩码钱包中自动接受请求而不要求确认
- javascript - 如何将matterjs连接到html?
- excel - 使用 Excel VBA 解析和更新 XBA
- c++ - 如何在 Yocto(开放式嵌入式)系统上开始使用 google 测试
- javascript - 如何限制附加元素的 div 视图(多个选项卡)
- reactjs - 如何使用下拉菜单制作语义 UI React 侧边栏
- python - DRF SocialLoginView callback_url 未在 AppleLogin 上重定向
- ios - 我应该如何处理 ITMS-90683:Info.plist 中缺少目的字符串
- spring - 在 MongoTemplate 方法中从 java 进行批量删除操作时出现 OOM(Java 内存不足)问题
- mongodb - 如何将 MongoDB 长格式集合导出为宽格式 csv