繁体   English   中英

在SQL字段WHERE LIKE%$ user_id%中搜索

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM