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

时间:2017-03-29 08:08:36

标签: php mysql sql

我有一个小问题。

我的表格如下:

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”,因此它也会返回它。

我该如何防止这种情况?

3 个答案:

答案 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