php - 为此创建 MySQL 查询的最佳方法

标签 php mysql

我们需要在 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/

相关文章:

php - SQL : keep count in row or select count from db

mysql - perl,mysql 表名限制?

php - 获取mysql记录的值并显示在下拉列表中

javascript - 如何在 WordPress 插件中使用 Ajax?

php - MySQL LIKE 语句和 PHP 变量

php - 如何创建数据库和表,并用数据填充它们?我有错误

Mysql - 如何将字符串中的日期与查询中的 unix 时间进行比较

python - MySqlDb throws Operand should contain 1 columns(s) on insert ignore statement

php - 获取选项名称 php

php - 如何在 PHP 中设置短标记 (<?)?