用户有一个学生(一对一),学生可以有多种语言和爱好(两次都是多次)。
如果我运行此查询,
SELECT email, hobbies.name, languages.name
FROM users
INNER JOIN students
ON users.id = students.user_id
LEFT OUTER JOIN languages_student
ON students.id = languages_student.student_id
INNER JOIN languages
ON languages_student.language_id = languages.id
LEFT OUTER JOIN hobbies_student
on students.id = hobbies_student.student_id
INNER JOIN hobbies
ON hobbies_student.hobbie_id = hobbies.id
WHERE users.id = 6
我得到了这个结果集:
如果我向学生添加另一种语言,我会在结果集中输入六行。有没有办法结合第二和第三列,以获得更紧凑和不冗余的东西?每个爱好只能出现一次,并在语言用完时获得NULL吗?
答案 0 :(得分:1)
有几种方法可以汇总这些信息。一种是根据您当前显示的结果集类型在应用程序逻辑中执行此操作。这可能是将结果集中的行读取到适当的数据结构中,然后您可以在应用程序中使用它来显示此信息。
第二种方法是使用GROUP_CONCAT()
将同一组(在本例中为电子邮件名称)中的值连接成一行。这可能会产生如下结果:
shields.katlynn@swaniaski.biz Endurance Sports,Golf Balochi,Assamesse
这可能意味着在您的应用程序中,您需要拆分每行中的数据以获得单个值。
您可以编写查询以获得上述结果的示例如下:
SELECT
email,
GROUP_CONCAT(DISTINCT hobbies.name) AS hobbies,
GROUP_CONCAT(DISTINCT languages.name) AS languages
FROM users
INNER JOIN students
ON users.id = students.user_id
LEFT OUTER JOIN languages_student
ON students.id = languages_student.student_id
INNER JOIN languages
ON languages_student.language_id = languages.id
LEFT OUTER JOIN hobbies_student
on students.id = hobbies_student.student_id
INNER JOIN hobbies
ON hobbies_student.hobbie_id = hobbies.id
WHERE users.id = 6
GROUP BY email
在任何一种情况下,您都需要在应用程序中进行某种检索后数据处理。