0

test と result という名前の 2 つのテーブルがあります。

  • 受験者が登録すると、テスト テーブルに挿入されます。
  • 候補者がテストを完了した場合、詳細が結果テーブルに挿入されます。

ここで、2 つのテーブルを比較し、候補者 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

joinLeft で条件を指定するのを忘れていませんか?

于 2012-05-25T20:49:11.263 に答える
0

zend docsから:

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

質問に答えられなくて申し訳ありませんが、たとえばtypeと呼ばれる識別子フィールドを持つ単一のテーブルを使用して、次のように使用してみませんか。

  • 候補者が登録すると、テストに設定されたタイプで挿入されます
  • 候補者がテストを完了した場合、そのタイプは完了に変更されます
于 2012-05-24T16:58:25.413 に答える