次のコードがあります。
$params = array();
$query_questions_visibles = questionTable::getInstance()->createQuery("q")
->select("q.*, ua.*, a.*, u.*, c.*")
->leftJoin("q.Answers a")
->leftJoin("a.UserAnswers ua")
->Where("q.blocked = false")
->andWhere("ua.user_id = :user_id")
->orderBy("q.id DESC")
->groupBy("q.id");
//Subquery --> Calculates when a question is active or not
$format = sfConfig::get("app_datetime_format");
$active_time = date($format, strtotime(sfConfig::get("app_question_active_time")));
$sub_query_is_active = $query_questions_visibles->createSubQuery()
->select("MAX(ua0.created_at)")
->from("question q0")
->leftJoin("q0.Answers a0")
->leftJoin("a0.UserAnswers ua0")
->where("q0.id = q.id");
$query_questions_visibles->addSelect("COALESCE((".$sub_query_is_active.") > :active_time, false) as Active");
//Set param values
$params["user_id"] = $guardUser->id;
$params["active_time"] = $active_time;
$result = $query_questions_visibles->execute($params);
前のコードは期待どおりに機能します。
生成された SQL が完成し、機能します。
q.id AS q__id、q.user_id AS q__user_id、q.category_id AS q__category_id、q.gender_restriction AS q__gender_restriction、q.question AS q_ question、q.photo AS q _photo、q.latitude AS q_ latitude、q.longitude AS を選択q _longitude、q.multiple AS q_ multiple、q.blocked AS q _blocked、q.created_at AS q__created_at、q.updated_at AS q__updated_at、a.id AS a__id、a.question_id AS a__question_id、a.text AS a_ text、u. id AS u_id, u.user_id AS u__user_id, u.answer_id AS u__answer_id, u.created_at AS u__created_at, u.updated_at AS u__updated_at, COALESCE((SELECT MAX(u2.created_at) AS u2__0 FROM question q2 LEFT JOIN answer a2 ON q2.id = a2.question_id LEFT JOIN user_answer u2 ON a2.id = u2.answer_id WHERE (q2.id = q.id)) > :active_time, 0) AS u2__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 WHERE (q.blocked = 0 AND u.user_id = :user_id) GROUP BY q.id ORDER BY q.id DESC
ただし、結果を制限したい場合は、最後の行を次のように変更します。
$query_questions_visibles->limit(10);
$result = $query_questions_visibles->execute($params);
Doctrine はエラーをスローします:
SQLSTATE[HY093]: パラメーター番号が無効です: バインドされた変数の数がトークンの数と一致しません
Doctrine_Connection->execute('SELECT DISTINCT q2.id FROM question q2 LEFT JOIN answer a2 ON q2.id = a2.question_id LEFT JOIN user_answer u2 ON a2.id = u2.answer_id WHERE q2.blocked = 0 AND u2.user_id = :user_id GROUP BY q2.id ORDER BY q2.id DESC LIMIT 10', array('user_id' => '1', 'active_time' => '2013-03-17 17:12:12')) in SF_ROOT_DIR\ lib\vendor\symfony\lib\plugins\sfDoctrinePlugin\lib\vendor\doctrine\Doctrine\Query.php 行 1290 ...
私の目的は、クエリを 10 件の結果に制限することだけです。¿COALESCE および MAX 関数を使用したサブクエリはどこにありますか? ¿私が指定したことのない SELECT DISTINCT があるのはなぜですか? q.id だけを選択するのはなぜですか?
私は一日中それを理解しようとしていますが、答えがありません...制限を設定するとこれが発生する理由はありますか?