【问题标题】:Doctrine multi-row groupBy countDoctrine 多行分组计数
【发布时间】:2013-03-13 14:54:11
【问题描述】:

我有以下关于教义的查询:

$q = Doctrine_Query::create()
    ->select("q.id, q.user_id, count(ua.id) as quantity")
    ->from("question q")
    ->leftJoin("q.Answers a")
    ->leftJoin("a.UserAnswers ua")
    ->groupBy("ua.user_id");

生成的 SQL 是:

SELECT q.id AS q__id, q.user_id AS q__user_id, COUNT(u.id) AS u__0 FROM question q LEFT JOIN answer a ON q.id = a.question_id LEFT JOIN user_answer u ON a.id = u.answer_id GROUP BY u.user_id

而这个查询在 MySQL 中的结果是这样的:

+-------+------------+------+
+ q__id + q__user_id + u__0 +
+-------+------------+------+
+     1 +          1 +    0 +
+-------+------------+------+
+    26 +          6 +    2 +
+-------+------------+------+
+    26 +          6 +    1 +
+-------+------------+------+

使用Doctrine,有没有办法获取“u__0”列值?

我试过了:

$questions = $q->execute();
echo (count($questions));

但结果只有 2 行(不是 3 行)。

如何获取“u__0”列值? (0, 2, 1) 使用 Doctrine?

【问题讨论】:

    标签: php count doctrine symfony-1.4 doctrine-1.2


    【解决方案1】:

    您必须为每个结果循环并检索quantity 值:

    $q = Doctrine_Query::create()
        ->select("q.id as id, q.user_id as question_user_id, ua.user_id as answer_user_id, count(ua.id) as quantity")
        ->from("question q")
        ->leftJoin("q.Answers a")
        ->leftJoin("a.UserAnswers ua")
        ->groupBy("answer_user_id");
    
    $results = $q->execute(array(), Doctrine_Core::HYDRATE_ARRAY);
    foreach ($results as $result)
    {
        var_dump($result['quantity']);
    }
    

    【讨论】:

    • 我的问题是,使用教义我只得到 2 个结果(在普通 SQL 中我得到 3 个结果),我认为 Doctrine 将最后两个结果“组合”为一个。
    • @Pipe 哦,我明白了!对不起,我误解了,我已经更新了我的答案。也许,如果您强制教义使用别名进行分组,它会起作用。顺便说一句,我认为您必须在选择中添加 ua.user_id。
    • nop,它会抛出错误:别名“a”和“ua”之间连接的左侧必须至少选择主键字段。
    • 你能提供你的架构的相关部分吗?所以我可以试一试
    • 我找到了解决方案,正在更改我的 SQL...我更新了我的问题...谢谢 :)
    【解决方案2】:

    我将 SQL 查询更改为:

    $q = Doctrine_Query::create()
        ->select("q.id, q.user_id, a.id, count(ua.id) as quantity")
        ->from("Answer a")
        ->leftJoin("a.Question q")
        ->leftJoin("a.UserAnswers ua")
        ->groupBy("ua.user_id");
    

    它有效;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-21
      • 2021-12-13
      • 2020-12-28
      • 2014-07-08
      • 1970-01-01
      • 2017-08-13
      相关资源
      最近更新 更多