我有一个小问题。
我的表格如下:
tbl_groups
id (int) | teacher_id (int) | student_ids (text)
------------------------------------------------
1 | 14 | 2015,2016,2017
2 | 35 | 15,16,17
3 | 14 | 631
student_ids
将使用implode()
填充PHP数组。
但是,当我执行以下查询以通过学生ID搜索群组的ID时:
SELECT `id` FROM `tbl_groups` WHERE `student_ids` LIKE '%15%'
我得到第1行和第2行。发生这种情况是因为将搜索student_ids
“15”,并且“2015”包含“15”,因此它也会返回它。
我该如何防止这种情况?
答案 0 :(得分:2)
您可以像这样使用 FIND_in_SET :它将返回一个值>如果它在集合中则为0。
SELECT `id` FROM `tbl_groups`
WHERE FIND_IN_SET('15',`student_ids`);
<强>样品强>
mysql> SELECT FIND_IN_SET('15','15,16,17');
+------------------------------+
| FIND_IN_SET('15','15,16,17') |
+------------------------------+
| 1 |
+------------------------------+
1 row in set (0,00 sec)
mysql> SELECT FIND_IN_SET('1','15,16,17');
+-----------------------------+
| FIND_IN_SET('1','15,16,17') |
+-----------------------------+
| 0 |
+-----------------------------+
1 row in set (0,00 sec)
mysql> SELECT FIND_IN_SET('17','15,16,17');
+------------------------------+
| FIND_IN_SET('17','15,16,17') |
+------------------------------+
| 3 |
+------------------------------+
1 row in set (0,00 sec)
mysql>
答案 1 :(得分:1)
值得重新考虑您的数据库结构,而不是您上面建议的布局考虑如下表格
基 id | teacher_id
student_group student_id | GROUP_ID
然后,您可以创建一个关系,其中该组属于教师(一对多)和多对多关系,即学生对组表允许许多学生成为多个组的成员。
这将允许您更可靠地查询包含学生的组。
答案 2 :(得分:0)
你可以尝试这个(如果你有一个大表,请注意性能:如果你有一个关于student_ids的索引,可能它不会被使用。无论如何使用LIKE&#39;%xxx%&#39;仅使用它使用&#34;扫描&#34;而不是&#34;搜索&#34;):
ActionListener