2012-09-18 200 views
0

使用GROUP_CONCAT這裏有一個我的數據庫結構的圖片:使用GROUP_CONCAT一個非常複雜的SQL語句在多個領域

Observation recording - database structure

隨着從這裏用戶的幫助,我已經成功地放在一起:

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"; 

這似乎工作正常,除了Focus,PositiveDevelopment各自重複取決於具有最高concat數的字段enations英寸

例如,如果PositivePace,Progress,AttainmentFocus只有Appraisal,它會被重複三次(Appraisal,Appraisal,Appraisal)。

Observation Recording - Complex join structure

我看這件事,我認爲這可能是因爲我需要GROUP這些GROUP_CONCAT JOINs的。但是,我不知道如何去做這件事。

任何人都可以幫忙嗎?在此先感謝,

回答

1

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"; 
+0

再次爵士...... :)非常感謝。 – dunc