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

时间:2012-02-16 08:16:43

标签: php mysql

我们需要在PHP / MySQL中创建一个程序,它将显示所有'人',他们在活动期间可能需要某些技能。每个人至少具有一项技能并且评分为1-5,这取决于该人对特定技能的熟练程度。例如,约翰有两种技能 - 绘画和绘画。他是绘画方面的专家,所以他对绘画的评价为5,而绘画的评分仅为2,因为他可以画画但不是很好。

管理员可以添加一些事件,其中包含该特定事件所需的技能。每个活动将包含仅一到八种不同技能的技能。例如,用户将创建一个名为Art Class Tutorial的事件,然后从预定义技能(由程序提供)中选择需要哪些技能。例如,在这种情况下,管理员选择雕刻,绘图和绘画。接下来,管理员需要找到具有雕刻或绘图或绘画技能的所有“人”(以便他们可以参加活动中的教学),其中评级不应低于3。

在这种情况下,约翰应该被展示,因为即使他的绘画只是2星级,他也有5星级的绘画评级。例如,如果Bob有雕刻,绘画和绘画,但所有人都有2星评级,则不应显示Bob。

所以我的问题是:我怎么能为此创建一个查询,因为该程序不知道事件需要多少技能以及选择哪些技能?对于我来说,组合各种可能性组合的可能性太多了。

顺便说一句,在我的表中,每个'人',都有八个领域(每个技能一个),每个技能应该包含每个技能等级。等级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;

4 个答案:

答案 0 :(得分:1)

只需这样做:

  • 在您的数据库中创建一些实体,例如:event,skill,people。
  • 以前的表必须与外键相关;所以你可能需要建立一些“中间”实体(想想事件/技能基数和技能/人)。
  • 现在,您可以针对每个事件查询数据库,从而提取该特定事件需要考虑的技能数量
  • 此时,您可以为WHERE条件
  • 创建一个字符串
  • 诀窍已经完成

希望它很清楚,并会帮助你

编辑(根据问题的作者请求)

中间实体是必须在两个实体之间存在n / m关系时创建的“特殊”实体(或表,如果您愿意以这种方式引用那些实体)。所以,如果'event'和'技能'有基数(并且它们有!)你必须创建一个表(比如r_event_skills),其中'r_event_skills'的PK由两个外键的组合组成(一个是约束于事件的PK,另一个约束于技能的PK)。 现在,你必须为技能/人重复同样的事情,然后就完成了诀窍。

答案 1 :(得分:1)

希望有所帮助

People's table
People_id People_name

skill's table
skill_id skill

listing table
people_id skill_id rating

然后为每个事件

select people_name from people where people_id in
(SELECT people_id FROM listing WHERE 
skill_id in (8,9,10) and (rating >=3 or rating =5) order by rating desc)
 limit `NOpersonRequired

答案 2 :(得分:0)

根据更新的问题更新:

我会创建一个包含5个表的数据库:

  • 人(包含人民)
  • 技能(包含所有可能的技能)
  • PeopleSkill(包含每个人,每个技能,得分)
  • 事件(包含管理员创建的事件)
  • EventSkillsRequired(包含偶数和技能ID)

管理员可以在Event表中创建一个Event。然后,他创建EventSkillsRequired记录,其中包含事件ID和事件所需的技能ID之一。

您需要创建一个接受eventid的php页面。以下查询返回至少具有一项技能分数>的技能的所有人员。活动需要3个。

SELECT People.firstname, People.lastname, Skills.name, Skills.score FROM People 
INNER JOIN PeopleSkill ON PeopleSkill.peopleid = People.peopleid 
INNER JOIN Skills ON Skills.skillsid = PeopleSkill.skillsid 
INNER JOIN EventSkillsRequired ON EventSkillsRequired.skillid = Skills.skillsid
WHERE PeopleSkill.score > 3 AND EventSkillsRequired.eventid = ${php evenid parameter}

答案 3 :(得分:0)

假设您有3个实体;

•'people',其中包含姓名,联系方式等基本信息

•'技能'列出了8种不同的技能

•'peopleskill'作为两者之间的联系,附加属性'Rating'显示他们对相关技能的熟练程度。

所以你可以拥有人民的技能,例如:

PERSON SKILL RATING

1 1 5

1 2 2

等等。我想象的代码就像这样。

$result = mysql_query=("SELECT * FROM peopleskill WHERE Skill_ID = $optionone OR $optiontwo OR $optionthree");

while($row=mysql_fetch_array($result)){

    $personid = $row['Person_ID'];
    $rating = $row['Rating'];
    if($rating=>3){

        $result2 = mysql_query("SELECT * FROM people WHERE Person_ID = $personid");
        while($row2=mysql_fetch_array($result2)){

            echo $row2['First_Name'];

        }
    }
}

对于这篇文章的布局抱歉,我不知道如何对这种格式进行排序,但希望你明白我的意思。