我正在重构一个Zend框架应用程序使用原则2.5 DBAL而不是Zend_DB(ZF1)。我有以下Zend_Db的查询:加入子查询与教条2 DBAL
$subSelect = $db->select()
->from('user_survey_status_entries', array('userSurveyID', 'timestamp' => 'MIN(timestamp)'))
->where('status = ?', UserSurveyStatus::ACCESSED)
->group('userSurveyID');
$select = $db->select()
// $selectColNames contains columns both from the main query and
// the subquery (e.g. firstAccess.timestamp AS dateFirstAccess).
->from(array('us' => 'user_surveys'), $selectColNames)
->joinLeft(array('firstAccess' => $subSelect), 'us.userSurveyID = firstAccess.userSurveyID', array())
->where('us.surveyID = ?', $surveyID);
这将导致以下MySQL查询:
SELECT `us`.`userSurveyID`,
// More columns from main query `us`
`firstAccess`.`timestamp` AS `dateFirstAccess`
FROM `user_surveys` AS `us`
LEFT JOIN (
SELECT `user_survey_status_entries`.`userSurveyID`,
MIN(timestamp) AS `timestamp`
FROM `user_survey_status_entries`
WHERE (status = 20)
GROUP BY `userSurveyID`
) AS `firstAccess` ON us.userSurveyID = firstAccess.userSurveyID
WHERE (us.surveyID = '10')
我无法弄清楚如何使用学说2.5查询生成器加入子查询。在主查询中,我需要从子查询中选择列。我已阅读here该原则不支持连接子查询。如果这仍然是真的,我可以使用doctrine DBAL的SQL查询构建器以另一种方式编写此查询吗?原生SQL可能对我而言不是一个好的解决方案,因为此查询将在代码中稍后动态扩展。
检索您的subSelect的结果,然后将其用作您选择的参数。 – Veve
@Veve subSelect的结果将是一个包含数千个元素的数组,我认为它不是首先检索它并将其用作主查询中的参数的可行方法。 – aimfeld
这是您试图构建的DQL或SQL吗? – Ocramius