我们需要在 PHP/MySQL 中创建一个程序,该程序将显示所有具有事件期间可能需要的某些技能的“人员”。每个人至少拥有一项技能,并且评分为 1 - 5,具体取决于该人对特定技能的熟练程度。例如,约翰有两种技能——绘画和绘画。他是绘画高手,所以绘画的评分是5分,而绘画的评分只有2分,因为他会画画,但画得不是很好。
管理员可以添加一些事件,其中包含该特定事件所需的技能。每个事件将包含从一到八种不同技能的技能。例如,用户将创建一个名为“艺术课教程”的事件,然后从预定义的技能(由程序提供)中选择其所需的技能。例如,在本例中,管理员选择雕刻、绘图和绘画。接下来,管理员需要找到所有具有雕刻或绘画或绘画技能的“人”(以便他们可以参与事件教学),其中评分不应低于3。
在这种情况下,应该显示约翰,因为即使他的绘画只有 2 星,他的绘画评级也为 5 星。例如,如果鲍勃有雕刻、绘画和绘画,但它们的评级均为 2 星,则不应显示鲍勃。
所以我的问题是:由于程序不知道一个事件需要多少技能以及选择了哪些技能,因此如何为此创建查询?可能性的组合太多了,我无法为每种可能的组合创建“if”。
顺便说一句,在我的每个“人”的表格中,存在八个字段(每个技能一个),其中应包含每个技能的每个技能等级。评级 0 表示不具备该领域的技能。
这是我当前的代码:
function search_results($keywords){
$returned_results = array();
$where = "";
$keywords = preg_split('/[\s]+/', $keywords);
$total_keywords = count($keywords);
foreach($keywords as $key=>$keyword){
$where .= "`keywords` LIKE '%$keywords%'";
if($key != ($total_keywords - 1)){
$where .= " AND ";
}
}
$results = "SELECT `title`, LEFT(`description`, 70) as `description` , `url` FROM `articles` WHERE $where";
$results_num = ($results = mysql_query($results)) ? mysql_num_rows($results): 0;
if($results_num === 0){
return false;
}else{
while($results_row = mysql_fetch_assoc($results)){
$returned_results[] = array(
'title' => $results_row['title'],
'description' => $results_row['description'],
'url' => $results_row['url']
);
}
return $returned_results;
最佳答案
只需这样做:
- 在您的数据库中创建一些实体,例如:事件、技能、人员。
- 以前的表必须与外键相关;因此,您可能必须构建一些“中间”实体(考虑事件/技能基数和技能/人员)。
- 现在,您可以针对每个事件查询数据库,动态提取该特定事件需要考虑的技能
- 此时,您可以为
WHERE
条件创建一个动态字符串 - 技巧完成
希望说得清楚并对您有所帮助
编辑(根据问题作者的要求)
中间实体是“特殊”实体,当两个实体(或表,如果您更喜欢以这种方式引用它们)之间存在 n/m 关系时,必须创建它们。因此,如果“event”和“skills”具有 m/n 基数(它们确实具有!),则必须创建一个表(例如 r_event_skills),其中“r_event_skills”的 PK 由两个外键(一个是一个受事件PK约束,另一个受技能PK约束)。 现在,您必须对技能/人员重复相同的操作,技巧就完成了。
关于php - 为此创建 MySQL 查询的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9307695/