【问题标题】:Using order by count in left joined tables在左连接表中使用按计数排序
【发布时间】:2012-03-30 12:35:56
【问题描述】:

我在按计数字段对查询结果进行排序时遇到问题。我的简化查询:

$customers = Doctrine_Core::getTable("Customer")->createQuery("c")
    ->leftJoin("c.Project p")
    ->orderBy("COUNT(p.id) ASC");
    ->execute();

我很确定问题与教义无关。从应用程序日志中检索到的 ORM 生成的查询只选择了一行,并且它包含一行:

ORDER BY COUNT( r2.id ) ASC

删除后正确选择了所有行。

ORDER BY 子句使查询只从客户表中选择一行。我认为这与客户没有分配任何项目有关。我做错了什么?

【问题讨论】:

  • 您能否将 ORM 生成的查询的其余部分添加到问题中?按聚合值排序只能在分组查询中完成 - 如果您想按 p.id(而不是 p.id 的计数)排序,那么您应该将查询更改为 ORDER BY r2.id ASC
  • 不,我希望它按相关行数排序。
  • “否”是否意味着您无法将 ORM 生成的查询的其余部分添加到问题中?
  • 不,不,这是关于按 id 排序的问题。稍后我将附加查询的其余部分,因为我现在无法访问该应用程序。
  • 另外,这是 MySQL 吗? (我怀疑这种形式的查询在大多数其他 RDBMS 中都会失败。)

标签: sql doctrine doctrine-1.2


【解决方案1】:

如果您尝试按客户的项目数量进行分组,请尝试使用 GROUP BY 子句并聚合客户的主键:

$customers = Doctrine_Core::getTable("Customer")->createQuery("c")
->select('c.*, count(p.id) as count')
->leftJoin("c.Project p")
->groupBy('c.id') // or the primary key of Customer
->orderBy("count ASC")
->execute();

【讨论】:

    猜你喜欢
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    • 2021-07-02
    相关资源
    最近更新 更多