MySQL在冗余行上

时间:2016-05-24 15:17:43

标签: mysql database

用户有一个学生(一对一),学生可以有多种语言和爱好(两次都是多次)。

如果我运行此查询,

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

我得到了这个结果集:

Result

如果我向学生添加另一种语言,我会在结果集中输入六行。有没有办法结合第二和第三列,以获得更紧凑和不冗余的东西?每个爱好只能出现一次,并在语言用完时获得NULL吗?

1 个答案:

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

在任何一种情况下,您都需要在应用程序中进行某种检索后数据处理。