mysql - 在多个字段上使用 GROUP_CONCAT

标签 mysql

这是我的数据库结构的图片:

Observation recording - database structure

在此处用户的帮助下,我成功地使用 GROUP_CONCAT 组合了相当复杂的 SQL 语句:

SELECT
     t1.Name AS Teacher_Name,
     t2.Name AS Observer_Name,
     o.Datetime AS Datetime,
     o.Type AS Type,
     o.Year_Group AS Year_Group,
     o.Class_Name AS Class_Name,
     c.Title AS Course_Name,
     GROUP_CONCAT(l.Title) AS Focus,
     o.Achievement_Grade AS Achievement_Grade,
     o.Behaviour_Grade AS Behaviour_Grade,
     o.Teaching_Grade AS Teaching_Grade,
     GROUP_CONCAT(cl1.Title) AS Positive,
     GROUP_CONCAT(cl2.title) AS Development,
     o.Notes AS Notes
FROM observations o
LEFT JOIN teachers t1 
    ON o.Teacher_ID = t1.Teacher_ID
LEFT JOIN teachers t2 
    ON o.Observer_ID = t2.Teacher_ID
LEFT JOIN courses c 
    ON o.Course_ID = c.Course_ID
LEFT JOIN  foci f
    ON o.ID = f.Observation_ID
LEFT JOIN focus_labels l
    on f.focus_id = l.id
LEFT JOIN  criteria c1
    ON o.ID = c1.Observation_ID
LEFT JOIN criteria_labels cl1
    on c1.Criteria_ID = cl1.ID AND c1.Type = 'P'
LEFT JOIN  criteria c2
    ON o.ID = c2.Observation_ID AND c2.Type = 'D'
LEFT JOIN criteria_labels cl2
    on c2.Criteria_ID = cl2.ID
GROUP BY o.id
ORDER BY `Datetime` DESC";

这似乎工作正常,除了 FocusPositiveDevelopment 分别根据具有最多的串联数。

例如,如果Positive具有Pace、Progress、Attainment,但Focus只是Appraisal,那么它'将重复三次(评估,评估,评估)。

Observation Recording - Complex join structure

我查了一下,我认为这可能是因为我需要对每个 GROUP_CONCAT JOIN 进行GROUP。但是,我不知道该怎么做。

有人可以帮忙吗?提前致谢,

最佳答案

GROUP_CONCAT具有可用于删除重复项的 DISTINCT 属性。

SELECT
     t1.Name AS Teacher_Name,
     t2.Name AS Observer_Name,
     o.Datetime AS Datetime,
     o.Type AS Type,
     o.Year_Group AS Year_Group,
     o.Class_Name AS Class_Name,
     c.Title AS Course_Name,
     GROUP_CONCAT(DISTINCT l.Title) AS Focus,
     o.Achievement_Grade AS Achievement_Grade,
     o.Behaviour_Grade AS Behaviour_Grade,
     o.Teaching_Grade AS Teaching_Grade,
     GROUP_CONCAT(cl1.Title) AS Positive,
     GROUP_CONCAT(cl2.title) AS Development,
     o.Notes AS Notes
FROM observations o
LEFT JOIN teachers t1 
    ON o.Teacher_ID = t1.Teacher_ID
LEFT JOIN teachers t2 
    ON o.Observer_ID = t2.Teacher_ID
LEFT JOIN courses c 
    ON o.Course_ID = c.Course_ID
LEFT JOIN  foci f
    ON o.ID = f.Observation_ID
LEFT JOIN focus_labels l
    on f.focus_id = l.id
LEFT JOIN  criteria c1
    ON o.ID = c1.Observation_ID
LEFT JOIN criteria_labels cl1
    on c1.Criteria_ID = cl1.ID AND c1.Type = 'P'
LEFT JOIN  criteria c2
    ON o.ID = c2.Observation_ID AND c2.Type = 'D'
LEFT JOIN criteria_labels cl2
    on c2.Criteria_ID = cl2.ID
GROUP BY o.id
ORDER BY `Datetime` DESC";

关于mysql - 在多个字段上使用 GROUP_CONCAT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12483994/

相关文章:

php - 我可以存储散列的电话号码并将其未散列发送到电子邮件吗?

javascript - AJAX PHP 数据库查询不起作用

mysql - 如何在整个表上使用 UNIX_TIMESTAMP?

mysql - 选择语句

MySQL - 有没有办法在满足给定条件后丢弃排序选择中的记录?

java - Spring - 无效参数值 : java. io.NotSerializableException

mysql - 从多列重新格式化 MySQL 表

mysql - 嵌套 JOIN 创建自定义动态列

mysql - MariaDB 仅选择大于的结果

mysql - 通过 pymysql 执行查询不返回与在 MySQL 中运行相同的结果