我目前正在使用mysql和php进行数据库项目,其中一个特定的查询给我带来了巨大的麻烦。
在这个项目中,我们必须搜索分包商的技能,例如java,c ++等,并评估他们的技能等级是否与所要求的等级值相等或更高。
我们有一个类似的数据库方案:
表子:
表区域:
表技能:
表技能:
表格suboskill:
小提取表保存了分包商与技能的N * N关系, 所以" 1,2,3,4"会说明id为2的转包商 具有id 3的技能和id为4的等级。
现在我想通过AND或OR连接查询多项技能, 例如"哪些分包商拥有技能java,其值为> = 2 AND c ++,其值为> = 4"。
OR查询工作正常(下面的代码),但AND查询给出0结果, 除非选择具有不同值的相同技能。
/*
* selectSubsBySkill
* search database for subcontractors with given skills and ratings
* parameter:
* -$skill_ids array of ids(int) of skills, same size as $ratings
* -$ratings array of rating values(int) for skills, same size as $skill_ids
* -$and boolean true if and connection, else or connection of skills
* return:
* array with matching subcontractors information
*/
public function selectSubsBySkill($skill_ids, $ratings, $and){
if(empty($skill_ids)){
return $this->selectSubs();
}
$sel = 'SELECT * FROM '.SUBS.','.REGIONS.','.SKILLS.','.SUBTOSKILL.','.SKILLRATINGS.' WHERE '.
SUB_REGION_ID.'='.REGION_ID.' AND '.SUBTOSKILL_SUB_ID.'='.SUB_ID.' AND '.
SUBTOSKILL_SKILL_ID.'='.SKILL_ID.' AND '.SKILLRATING_ID.'='.SUBTOSKILL_RATING_ID.' AND (';
$i=0;
foreach($skill_ids as $skill_id){
$sel .= '('.SKILLRATING_VALUE.'>='.$ratings[$i].' AND '.SUBTOSKILL_SKILL_ID.'='.$skill_id.')';
if($i<sizeof($skill_ids)-1){
if($and)$sel .= ' AND ';
else $sel .= ' OR ';
}
$i++;
}
$sel .= ') GROUP BY '.SUB_ID;
return $this->query($sel);
}
我已经尝试了其他一些例子,包括使用UNION或JOIN查询,但仍然没有任何效果。
如果有人在这里提示解决这个问题,我会很高兴。