2012-08-04 116 views
1

我在cakePHP中有两个表。CakePHP嵌套两个select查询

competencies 
------------ 
id 
name 

competenceRatings 
----------------- 
id 
competence_id 
user_id 
rating 

我需要一种方法来写在蛋糕的方式下面的查询:

SELECT * FROM能力WHERE ID NOT IN(SELECT competence_id FROM competence_ratings WHERE雇员= $用户id)

有人请帮我!!

我做了什么,才去这个子查询方法:

我试图competencies-> hasMany-> competenceRatings,competenceRatings-> belongsTo->竞争力的关系。

$competencies = $this->Competence->CompetenceRating->find('all',array('CompetenceRating.user_id' => $userId,'CompetenceRating.competence_id !=' => 'Competence.id')); 

我希望能够获得用户没有对能力评分表进行任何评分的能力的名称。即,我需要能力表中没有条目的能力表中的名称列表(对于给定的user_id)。

编辑

我试着表中还加入:

$options['joins'] = array(
      array(
       'table' => 'competence_ratings', 
       'alias' => 'CompetenceRating', 
       'type' => 'LEFT OUTER', 
       'conditions' => array(
        'Competence.id = CompetenceRating.competence_id' 
       ) 
      ) 
     ); 
$options['conditions'] = array('CompetenceRating.employee_id' => $employee['Employee']['id']); 

$competencies = $this->Competence->find('all',$options); 
+0

你到目前为止做了什么? – mark 2012-08-04 18:33:31

+0

我正在谈论实际的代码。而不是只发布预期的结果,你也应该发布你到目前为止的代码。你可以编辑并完成你的问题。 – mark 2012-08-04 18:44:19

+0

你再问同样的问题2或3小时你问“CakePHP表加入两个表问题”这个问题 – 2012-08-04 18:44:50

回答

2

你可能不得不使用子查询():

$subqueryOptions = array('fields' => array('competence_id'), 'conditions' => array('employee_id'=>$user_id)); 
$subquery = $this->Competence->CompetenceRating->subquery('all', $subqueryOptions); 

$res = $this->Competence->CompetenceRating->find('all', array(
    'conditions' => array('id NOT IN '. $subquery) 
)); 

的子查询的来源是在这里: https://github.com/dereuromark/tools/blob/2.0/Lib/MyModel.php#L405 你需要把它放在你的AppModel.php

但我认为子查询是没有必要的。你也许可以做一个单一的,易于查询出来的:

$this->Competence->CompetenceRating->find('all', array(
    'group' => 'competence_id', 
    'conditions' => array('NOT' => 'employee_id'=>$user_id)), 
    'contain' => array('Competence') 
)); 

不要忘记包括通过“包含”如果你有递归设置为-1能力。

+0

非常感谢!我希望在单个查询中做到这一点,但我无法做到这一点。我怎样才能让它发生?你不介意看看我的编辑? – Ivin 2012-08-04 19:50:53

+0

我试过你的第二种方法。这就是它的作用:SELECT'CompetenceRating'.'id','CompetenceRating'.'competence_id','CompetenceRating'.''user_id','CompetenceRating'.'ratinging','CompetenceRating'.'remarks','CompetenceRating' .'dated','CompetenceRating'.'created','CompetenceRating'.'modified' FROM'appraisal'.'competence_ratings' AS'CompetenceRating' WHERE NOT('user_id' ='28')GROUP BY competence_id – Ivin 2012-08-04 20:12:38

+0

我想要能力表字段! – Ivin 2012-08-04 20:13:01