首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为此创建MySQL查询的最佳方法

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

Stack Overflow用户
提问于 2012-02-16 16:16:43
回答 4查看 206关注 0票数 2

我们需要在PHP/MySQL中创建一个程序,该程序将显示所有的‘人’,谁有一定的技能,可能需要在一个事件。每个人至少有一项技能,评分为1-5,这取决于该人对特定技能的熟练程度。例如,约翰有两项技能--绘画和绘画。他是绘画专家,所以他的绘画评分是5分,而绘画评分只有2分,因为他会画画,但不是很好。

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

在这种情况下,应该显示John,因为他的绘画评级为5星,即使他的绘画只有2星。例如,如果Bob有雕刻、素描和绘画,但所有这些都有2星级的评级,则Bob不应显示。

所以我的问题是:既然程序不知道事件需要多少技能以及选择了哪些技能,我如何为此创建查询?可能性的组合对我来说太多了,我无法为每个可能的组合创建if。

顺便说一句,在我的表中,对于每个“人”,存在八个字段(每个技能一个),其中应该包含每个技能的每个技能评级。评分为0表示不具备该领域的技能。

下面是我的当前代码:

代码语言:javascript
运行
复制
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;
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-02-16 16:21:48

简单地做到这一点:

在数据库中创建一些实体,如: event,skill,people.

  • Previous表必须与外键相关;因此,您可能必须构建一些“中间”实体(考虑到event/skill cardinality和skill/people).

  • Now,您可以为每个事件查询DB并动态提取对于该特定事件必须考虑多少技能此时,您可以为您的技巧条件创建一个字符串
  • WHERE is done

希望这篇文章能对你有所帮助。

编辑(在问题的作者请求下)

中间实体是“特殊的”实体,当你在两个实体之间有n/m的关系(或者表格,如果你愿意以这种方式引用那些实体)时,必须创建这些实体。所以,如果'event‘和'skills’有一个m/n的基数(它们确实有!)您必须创建一个表(比方说r_event_skills),其中'r_event_skills‘的PK由两个外键的组合组成(一个约束到event的PK,另一个约束到skill的PK)。现在,你必须对技能/人员重复同样的操作,这个技巧就完成了。

票数 1
EN

Stack Overflow用户

发布于 2012-02-16 17:17:33

希望能有所帮助

代码语言:javascript
运行
复制
People's table
People_id People_name

skill's table
skill_id skill

listing table
people_id skill_id rating

然后,对于每个事件

代码语言:javascript
运行
复制
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
票数 1
EN

Stack Overflow用户

发布于 2012-02-16 16:25:46

根据更新的问题进行了更新:

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

Event事件人员(包含peoples)

  • Skills (包含所有可能的skills)

  • PeopleSkill (包含每个人的每个技能的分数))

(包含由admin)

  • EventSkillsRequired创建的事件(包含evenid和技能id)

管理员可以在事件表中创建事件。然后,他使用事件id和事件所需的技能id之一创建EventSkillsRequired记录。

您需要创建一个接受eventid的php页面。下面的查询返回事件所需的至少有一项技能且技能得分大于3的所有人员。

代码语言:javascript
运行
复制
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}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9307695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档