【问题标题】:SQL query to search for user tokens(skills)用于搜索用户令牌(技能)的 SQL 查询
【发布时间】:2013-01-14 10:40:34
【问题描述】:

我正在我的网站上构建一个搜索系统,用于搜索用户技能,此技能以令牌的形式呈现,用户技能的 db 表如下所示:

 id=> primary id(auto increment), 
user_id=> this is the user id,  
competence_nom=> this is the skill name, 
competence_id=> this is the skill parent id

所以我想要的是当两个技能(或更多..)属于一个用户时,显示如下:

user name + skill one + skill two

而不是这样(我现在正在实现的目标)

user name +skill one
user name +skill two

我正在使用 jQuery tokeninput 插件将令牌数据传递给服务器端,我将技能 id 传递给服务器端,然后在服务器端我分解 jQuery tokeninput 给出的技能数组:

 $comps=explode(",", $_POST["competences"]); 

然后我把它放在一个 foreach 循环中:

 foreach($comps as $i=>$v){  


}

这就是我得到错误输出的地方:

user name +skill one
    user name +skill two

【问题讨论】:

  • 我认为单个 mysql 查询不会为您提供所需格式的结果。您需要获取数据并在您的 php 代码中对其进行重组。
  • 是的,我正在尝试通过从 sql 查询中填充数组来做到这一点,但我仍然无法成功。
  • 你现在使用什么查询?
  • 这个查询中有很多不一致的东西,但它给了我重复的模式:$a=$db->query("SELECT * FROM competences, competences_user, users WHERE users.id=user_id AND ".$_comps."=competence_id AND ".$_comps."=c_id AND user_id!=0 GROUP BY c_id "); (这个查询在 foreach 中)

标签: php jquery mysql jquery-tokeninput


【解决方案1】:

据我目前了解,这是您的数据模型的问题。

核心问题是您的数据模型必须支持哪些用例,以及作为其中一部分的基础查询必须有多高效。

如果您的技能集非常有限并且需要非常高的性能,您可能希望寻求一种解决方案,将技能集真正表示为位集。

如果清晰的用户界面和清晰的数据模型是主要目标,而性能可能是次要的,那么人们想到的方法是在一张表中包含人员核心数据的关系数据模型,并在第二张表中分配技能,就像这样:

TABLE person
id: (auto increment)
name: (or split into first name etc)
email: (etc, you get the idea)

TABLE skill
id: (auto increment)
description:

TABLE personskill
personid: (reference to person.id)
skillid: (reference to skill.id)

然后,通过关系数据库查询,系统将回答哪个技能分配给哪个人的问题。

SELECT skillid FROM personskill WHERE personid = (id of person you're looking at)

【讨论】:

  • 我有你发布的确切表格方案,我的问题来自 php foreach 我在服务器端重复数据:user name +skill one user name +skill two
  • @user7832 好吧,我被你在“personskill”表中似乎有技能名称和自动增量 ID 的事实误导了,我看不出原因。所以我不会说你有我建议的“确切”表格方案。
  • 哦,抱歉,是的,我在“personskill”表中有一个自动增量 ID,因为人们可以动态添加技能(因此该技能会添加到主技能表中,但也可以作为特定用户的技能)
  • @user7832 用户可以动态添加技能这一事实是在什么情况下在一个简单地将技能与一个人相关联的表中拥有一个自动递增的 id 的原因?另外,为什么要复制名称?
  • 拥有或没有人工智能不会影响任何事情,它可能很冗长。名称的复制也很冗长,但我认为这不会改变我进行查询的方式。
【解决方案2】:

你可以使用mysql的GROUP_CONCAT命令。

这里是该命令详细信息的链接

http://www.w3resource.com/mysql/aggregate-functions-and-grouping/aggregate-functions-and-grouping-group_concat.php

希望这会有所帮助。

谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-05
    • 2014-08-21
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    • 1970-01-01
    相关资源
    最近更新 更多