gpt4 book ai didi

mysql - 将带有子查询的 MySQL 转换为 DQL 1.2

转载 作者:行者123 更新时间:2023-11-29 01:31:13 31 4
gpt4 key购买 nike

您好,我有来自 previous question 的以下查询并且需要将其转换为 DQL 以适用于 Doctrine 1.2。然而事实证明,DQL 不支持连接中的子查询。

SELECT * FROM contact c
LEFT JOIN
(SELECT a1.contact_id, a1.date, a1.activity_type_id FROM activity a1
JOIN (SELECT contact_id, MAX(DATE) DATE FROM activity GROUP BY contact_id) a2
ON a1.contact_id = a2.contact_id AND a1.date = a2.date
) a
ON c.id = a.contact_id

WHERE a.activity_type_id = 2;

我正在尝试弄清楚如何在不求助于多个查询的情况下以另一种方式执行此操作。

谢谢。

最佳答案

使用 doctrine,你不应该使用原始 sql 将子查询嵌套到 where 条件中。在更复杂的场景中你会遇到麻烦。而是使用 createSubquery 来显式地告诉 doctrine 有关子查询的信息,让 doctrine 将其编译为 DQL,然后将其嵌套到您的 where 条件中。所以你的查询应该是这样的:

$q->from('Contact c') 
->leftJoin('c.Activity a')
;

$subquery = $q->createSubquery()
->select("a1.contact_id, MAX(a1.date) a1.date")
->from("Activity a1")
->groupby("a1.contact_id")
;

$q->where('ROW (c.id, date) IN ('.$subquery->getDql().')')
->andWhere('a.activity_type_id = ?', $filterActivityTypeId)
;

另一个例子可以在这里找到:

https://www.philipphoffmann.de/2012/08/29/a-bulletproof-pattern-for-creating-doctrine-subqueries-of-any-complexity/

关于mysql - 将带有子查询的 MySQL 转换为 DQL 1.2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11855503/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com