【发布时间】:2018-04-03 14:13:13
【问题描述】:
我有这个查询,用 DQL 编写:
SELECT
p
FROM
Plan p
LEFT JOIN
p.requests r
WHERE
p.endsAt > :now
AND p.organization = :organization
GROUP BY p.id
HAVING SUM(CASE WHEN r.isAccepted IS NULL THEN 0 ELSE r.isAccepted END) = 0
ORDER BY p.id DESC
Wich 绑定到分页器。 在分页器上迭代时,出现以下错误:
SQLSTATE[42000]:语法错误或访问冲突:1055 表达式 #16 的 SELECT 列表不在 GROUP BY 子句中并且包含非聚合 列 'o1_.is_accepted' 没有功能 依赖于 GROUP BY 子句中的列;这与 sql_mode=only_full_group_by")。
是由于Doctrine在生成SQL查询时,在select子句中增加了一个列(o1_.is_accepted AS is_accepted_15)(简化后没有分页器的COUNT操作):
SELECT o0_.id AS id_0, o0_.average_hourly_rate AS average_hourly_rate_1, o0_.teacher_to_contact_count AS teacher_to_contact_count_2, o0_.starts_at AS starts_at_3, o0_.ends_at AS ends_at_4, o0_.reference AS reference_5, o0_.bac_plus3 AS bac_plus3_6, o0_.created_at AS created_at_7, o0_.is_paid AS is_paid_8, o0_.paid_at AS paid_at_9, o0_.teacher_who_accepted_count AS teacher_who_accepted_count_10, o0_.unit_price_excluding_vat AS unit_price_excluding_vat_11, o0_.billed_amount AS billed_amount_12, o0_.description AS description_13, min(o1_.is_accepted) AS sclr_14, o1_.is_accepted AS is_accepted_15
FROM organization_teacher_request_plan o0_
LEFT JOIN
organization_teacher_request o1_
ON o0_.id = o1_.plan_id
WHERE
o0_.ends_at > ?
AND o0_.organization_id = ?
GROUP BY o0_.id
HAVING SUM(CASE WHEN o1_.is_accepted IS NULL THEN 0 ELSE o1_.is_accepted END) = 0
没有 sql 模式“only_full_group_by”也可以正常工作。但我想将此查询修复为迁移到 MySQL 5.7 的最佳实践。
添加MIN(r.isAccepted) 不起作用,因为无论如何添加了o1_.is_accepted 字段。
编辑:这是 DQL 查询的 HAVING SUM(CASE WHEN r.isAccepted IS NULL THEN 0 ELSE r.isAccepted END) = 0 部分,它在 select 子句中添加了相应的字段,一个原则错误?
【问题讨论】:
标签: mysql doctrine-orm dql