2015-09-03 15 views
0

在表class_group中,list_students_id列包含文本,其中包含逗号分隔的用户在当前组组中的用户ID。 例如:组ID:1 - 组名称:组1 - list_students_id:2,43,45,50 ... 我知道这不是最佳的,但我无法更改数据库结构。 我要查询的组名,如果学生是该组中和我写了下面的代码,我觉得这是不是最佳的如何以另一种方式编写此查询

SELECT user.firstname,user.lastname,user.username,user.alt_id,user.email,class_group.group_name 
FROM user LEFT JOIN class_group 
ON (class_group.list_students_id LIKE CONCAT(user.id,',%') OR class_group.list_students_id LIKE CONCAT('%,',user.id,',%')) 

任何其他方式做到这一点?

回答

0

有时候我们会被其他人对数据库设计的真正糟糕的决定所困扰。你应该知道实现这种结构的正确方法。 SQL具有很好的列表数据结构。它被称为不是字符串

在任何情况下,我想你想:

SELECT u.firstname, u.lastname, u.username, u.alt_id, u.email, cg.group_name 
FROM user u LEFT JOIN 
    class_group cg 
    ON find_in_set(u.id, list_students_id) > 0; 

注意这个查询无法使用索引的,所以性能一般会比使用合适的数据结构恶化。

+0

感谢的人使用,这为我节省了大约60毫秒。是的,我同意我在这家公司坚持使用这个数据库模式,因为他们说它是针对特定功能进行了优化的,他们不知道我们会在别处使用它,现在更改数据库将需要重构很多代码,所以它有点伤心。 –

0

的一种方法是使INSTR()功能

SELECT user.firstname,user.lastname,user.username,user.alt_id,user.email, 
class_group.group_name 
FROM user LEFT JOIN class_group 
ON INSTR(class_group.list_students_id, user.id) > 0; 
+0

如果列表中包含用户标识(例如:user.id = 71 - 元素:571或271 ....),但无论如何感谢您的帮助 –

+1

是的,你是对的 –