【问题标题】:Reuse doctrine alias in select clause在 select 子句中重用学说别名
【发布时间】:2016-07-08 08:22:25
【问题描述】:

我在 Doctrine 中有以下 SELECT 子句(查询本身是使用查询生成器创建的):

u.username,
MAX(p.score) as highscore,
SUM(pc.badgeCount) as badgeCount,
(SUM(pc.badgeCount) / :badgeSum) AS probability,
(-LOG(RAND()) * probability) as weight

p是主实体的别名,pc是联合实体)

这给了我来自 MySQL 的错误消息:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'probability' in 'field list'

如何在同一个 SELECT 子句中重复使用创建的别名?

【问题讨论】:

  • 你需要一个子查询。我不知道教义是否有任何优雅的方式来编写子查询 - 但我宁愿用 PHP 计算 probabilityweight
  • 正确的非 hackish 方式是 subquery/cte using a calculated column in the same query 或简单的复制粘贴表达式定义,它将适用于各种 SQL。您正在搜索的机制称为 lateal column reference

标签: php mysql doctrine-orm doctrine


【解决方案1】:

我不会称之为“重用”。相反,我会称之为“使用”。

GROUP BYHAVINGORDER BY 子句之前,您不能使用别名。

另一种可能是使用@variable:

u.username,
MAX(p.score) as highscore,
SUM(pc.badgeCount) as badgeCount,
@prob := (SUM(pc.badgeCount) / :badgeSum) AS probability,
(-LOG(RAND()) * @prob) as weight

“AS”部分仍然为显示和后面的子句提供列名。同时,@prob 提供了一个“立即”的值。

我说“可能”是因为我认为 @variables 的这种使用正在消失。 SELECT 元素的评估顺序在标准中可能是“未定义的”。上面显示的使用取决于要按词法顺序完成的元素。

【讨论】:

  • 我一直很喜欢阅读你的答案——我只是很难摆脱你的心理形象 THIS Rick James:youtube.com/…
  • 谢谢!看起来不错。唯一的问题是如何在 QueryBuilder 中获取它,因为看起来 Doctrine ORM 不支持 MySQL 变量。有什么想法吗?
  • 它是否将CALLs 处理为存储过程?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多