[英]Searching in SQL field WHERE LIKE %$user_id%
我有一个小问题。
我的桌子如下:
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%'
我得到返回的第一行和第二行。 发生这种情况的原因是,将搜索student_ids
“ 15”,并且“ 2015”包含“ 15”,因此它也将返回它。
我该如何预防?
您可以像这样使用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>
值得重新考虑您的数据库结构,而不是上面建议的布局,而是考虑如下表
群组ID | Teacher_id
student_group student_id | group_id
然后,您可以创建一个关系,其中该组属于一个老师(一对多),并且在“学生到组”表上具有“多对多”关系,从而允许许多学生成为许多组的成员。
这样,您就可以更可靠地通过ID来查询包含学生的组。
您可以尝试执行此操作(如果您有一张大桌子,请注意性能:如果您在student_ids上有一个索引,则可能不会使用该索引。无论如何,使用LIKE'%xxx%'只能将其与“ scan”一起使用,而不与“ seek”一起使用“”:
SELECT `id` FROM `tbl_groups` WHERE CONCAT(',',`student_ids`,',') LIKE '%,15,%'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.