0

我有两个名为 test 和 result 的表。

  • 如果候选人注册,那么它将被插入到测试表中。
  • 如果候选人完成了测试,那么详细信息已被插入到结果表中。

现在我需要一个查询来比较两个表并使用候选人 ID 填充未完成测试的详细候选人。我正在使用 zend 框架工作,请指导我我正在使用此代码,但它不起作用

$dbTableInfo = $this->getDbTable()->info(); 
$select->from(array(
    'c1' => 'test'),
    array('c1.candidate_id', 
        "CONCAT( c1.first_name,
        ' ', 
        c1.last_name ) AS full_name",
    'c1.active',
    'c1.sendlink', 
    'c1.date_added',
    'c1.username',
    'c1.date_modified', 
    'c1.test_id')
);
$select->joinLeft(array('re'=>'result'));
$select->where("c1.business_id='" . $cid . "' AND 'c1.candidate_id NOT IN(re.candidate_id)'");
$select->order('c1.candidate_id');
4

3 回答 3

0

来自zend 文档

使用 joinLeft(table, condition, [columns]) 方法进行 LEFT JOIN。包括左操作数表中的所有行,包括右操作数表中的匹配行,如果不存在与左表匹配的行,则右操作数表中的列将填充为 NULL。

并且在您的查询中,您既没有指定条件也没有指定要返回的列。

例如,您可以像这样进行加入:

$select->from(array(
    'c1' => 'test'),
    array('c1.candidate_id', 
        "CONCAT( c1.first_name,
        ' ', 
        c1.last_name ) AS full_name",
    'c1.active',
    'c1.sendlink', 
    'c1.date_added',
    'c1.username',
    'c1.date_modified', 
    'c1.test_id')
);
$select->joinLeft(
            array('re'=>'result'),
            '"c1".candidate_id = "re".candidate_id',
             "*"
);
于 2012-05-25T22:13:19.173 回答
0

也许您忘记在 joinLeft 中指定条件?

于 2012-05-25T20:49:11.263 回答
0

很抱歉没有回答你的问题,但你为什么不简单地使用一个带有鉴别器字段的表,例如,这将被称为类型,并以这种方式使用它:

  • 如果候选人注册,他将被插入类型设置为测试
  • 如果候选人完成了测试,那么他的类型将更改为已完成
于 2012-05-24T16:58:25.413 回答