如何以其他方式编写此查询

时间:2015-09-03 01:38:05

标签: mysql sql

在表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,',%'))

还有其他办法吗?

2 个答案:

答案 0 :(得分: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;

请注意,此查询无法使用索引,因此性能通常比使用适当的数据结构更差。

答案 1 :(得分: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;