我有一个表格,员工可以根据自己的技能搜索学生的详细信息。 在表单中,我有一个选择框,员工可以在其中选择(java,php,android ...)等技能。选择一个值后,它将与存储在数据库中的多个值匹配,并仅显示技能匹配的记录。
但我得到意想不到的输出。
示例: - 员工选择技能为“C”。现在有两个学生在db和学生A有以下技能(C,java,php)和学生B有以下技能(css,android,dotnet)。所以根据输入,只有学生A应该显示,但我得到两个,因为学生B有一个名为'css'的值,这里c是一个起始字母表。
任何想法如何避免这种情况。我在php中使用了以下查询来获得结果。请帮我解决这个问题。
$skl = implode(",",$_REQUEST['serskil']);
$qr = mysql_query("SELECT * FROM stdreg WHERE skills LIKE '%$skl%'");
答案 0 :(得分:1)
$skl = $_REQUEST['serskil'];
SELECT * FROM stdreg WHERE FIND_IN_SET('$skl', skills)>0;
$skl = $_REQUEST['serskil'];
SELECT * FROM stdreg WHERE skills like '%,$skl' or skills like '$skl,%' or skills like '%,$skl,%';
<强> Reference on FIND_IN_SET 强>
编辑:实际上,此代码不需要implode()
。对不起,我错过了指定。
答案 1 :(得分:0)
试试这个
$skl = preg_split("/','/", $_REQUEST['serskil']);
$qr = mysql_query("SELECT * FROM stdreg WHERE skills LIKE '$skl'");
这将搜索确切的字符串。
答案 2 :(得分:0)
您的数据库结构未正常规范化。理想情况下,您需要一个像(例如skill_table
)表那样的表:
skill_id | skill_name
--------- -----------
1 | C
2 | java
3 | php
另一张表,假设student_skill
与学生的技能相匹配,如上表所示:
student_id | skill_id
---------- --------
S1 | 1 //Student s1 has skill C
S1 | 2 //Student s1 has skill java
S1 | 3 //Student s1 has skill php
S2 | 1
有了这一切,你需要做的就是:
$skl = $_REQUEST['serskil'];
$qr = mysql_query("SELECT student_id FROM student_skill WHERE skill_id=(SELECT skill_id from skill_table where skill_name='".$skl."')");
//If `$_REQUEST['serskil']` is C, this query will output `S1`,`S2`
答案 3 :(得分:-1)
你可以尝试这种方法。
首先,您应该将数据库规范化到尽可能最佳的水平。在您的情况下,让我们创建一个名为'student'的表:
CREATE TABLE student (student_id int NOT NULL PRIMARY KEY AUTO_INCREMENT, first_name varchar(20) NOT NULL, last_name varchar(20) NOT NULL);
然后是一个名为'技能'的表:
CREATE TABLE skill (skill_id int NOT NULL PRIMARY KEY AUTO_INCREMENT, skill_name varchar(10) NOT NULL UNIQUE);
最后一张名为'students_skill'的表格:
CREATE TABLE students_skill (students_skill_id int NOT NULL PRIMARY KEY AUTO_INCREMENT, student int NOT NULL, skill int NOT NULL);
最后一张桌子将为学生存储他们技能的组合,这种关系是一对多的。表student
上的列skill
和student_skill
是外键。
然后我们将索引添加到我们的外键:
ALTER TABLE `students_skill` ADD INDEX( `student`, `skill`);
我们还会为UNIQUE
和student
添加skill
值,以避免在输入具有相同技能的同一学生时出现重复问题:
ALTER TABLE `students_skill` ADD UNIQUE( `student`, `skill`);
最后,添加外键约束:
ALTER TABLE students_skill ADD CONSTRAINT fk_student FOREIGN KEY (student) references student (student_id);
ALTER TABLE students_skill ADD CONSTRAINT fk_skill FOREIGN KEY (skill) references skill (skill_id);
现在,我们假设我们在桌子上有这个值:
Table student (student_id = first_name, last_name)
1 = Kiel, Labuca
2 = Labuca, Kiel
Table skill (skill_id = skill_name)
1 = php
2 = css
3 = html
4 = c
Table students_skill (student_skill_id = student / skill)
1 = 1 / 2 (Kiel, Labuca / css)
2 = 1 / 3 (Kiel, Labuca / html)
3 = 2 / 1 (Labuca, Kiel / php)
4 = 2 / 4 (Labuca, Kiel / c)
现在,如果我们想要选择具有C编程语言的技能的学生,这是我们的查询:
SELECT CONCAT(student.last_name, ', ', student.first_name) AS 'name' FROM student, skill, students_skill WHERE student.student_id = students_skill.student AND skill.skill_id = students_skill.skill AND skill.skill_name = 'C';
上述查询只会输出学生Labuca, Kiel
,因为他是student
唯一具有技能C
的人。
如果您想使用HTML
在表格中显示,请输入以下代码:
<?php
$resultSet = mysql_query("SELECT CONCAT(student.last_name, ', ', student.first_name) AS 'name' FROM student, skill, students_skill WHERE student.student_id = students_skill.student AND skill.skill_id = students_skill.skill AND skill.skill_name = 'C'");
?>
<table>
<thead>
<th>Student Name</th>
</thead>
<tbody>
<?php while($result = mysql_fetch_assoc($resultSet)){ ?>
<tr>
<td><?php echo $result['name']; ?></td>
</tr>
<?php } ?>
</tbody>
</table>
尝试尝试不同的查询条件变体。您想要的输出取决于您的查询条件。祝你好运,编码愉快。