2017-03-29 8 views
0

私は小さな問題があります。

tbl_groups

id (int) | teacher_id (int) | student_ids (text) 
------------------------------------------------ 
1  | 14    | 2015,2016,2017 
2  | 35    | 15,16,17 
3  | 14    | 631 

student_idsimplode()を使用してPHPの配列によって満たされます:次のように

は、私は私のテーブルを持っています。私は学生証でグループのIDを検索するには、次のクエリを実行しかし

、:

SELECT `id` FROM `tbl_groups` WHERE `student_ids` LIKE '%15%' 

私は、行1を取得し、2が返されます。これは、student_ids "15"が検索され、 "2015"に "15"が含まれているために返されるために発生します。

どうすればこの問題を防ぐことができますか?

+2

CSVとして値を格納するには、非常に悪いデータベース設計です。あなたはそれを再設計するべきです。その間に[find_in_set()](https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_find-in-set)を使用することができます – Jens

+0

WHERE 'student_ids' = 15'を使用してみませんか? – David

+1

@davidこれは動作しません。なぜなら、 'student_ids'はどこでも" 15 "と一致しないからです。 – Kevdev

答えて

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> 
0

大規模なテーブルの場合は、パフォーマンスに注意してください:student_idsにインデックスがある場合は、おそらくそれは使用されません。とにかくLIKE '%xxx%'を使用している場合は、ではない)「求める」と:|

SELECT `id` FROM `tbl_groups` WHERE CONCAT(',',`student_ids`,',') LIKE '%,15,%' 
+0

「大きなテーブルを持っている場合は、パフォーマンスに注意してください」とはどういう意味ですか? – Kevdev

+0

find_in_set関数がこれを行う方が良いです:https://dev.mysql.com/doc/refman/5.7/en/string-functions .html#function_find-in-set – Dorian

1

それはあなたのデータベース構造を再検討する価値がある、代わりにレイアウトのあなたは

グループ IDを次のようにテーブルを持つ上記の検討を示唆していますteacher_id

student_group student_id | group_id

グループが教師(1対多)に属し、多対多の関係が学生対グループテーブルに属し、多数の生徒が多くのグループのメンバーになることができる関係を作成できます。

これにより、IDを使って学生を含むグループをより確実に照会することができます。

関連する問題