2012-03-07 49 views
1

考慮三個實體的學生,當然,主題 下面是協會 -GROUP_CONCAT在兩個不同的表給出了第二個表中重複結果

student has_many courses, 
student has_many subjects. 

現在我想取得與使用主題名稱和課程名稱學生記錄mysql group_concat,加入課程,加入科目和group_by student_id。

問題是group_concat('subjects.name') as subject_names給了我重複的主題條目,但group_concat('students.name') as student_names給出了唯一的名字。

爲什麼?

+0

你可以添加你的查詢嗎? – Java 2012-03-07 14:21:38

回答

8

的2左側聯接經由子行的笛卡爾乘積乘以行每個學生

  • 學生1具有3個療程和2名受試者
  • 生成6行對學生1
  • 給出一個course每個科目的價值=每個科目重複兩次
  • 給出了每個過程一個subject值=每個受試者重複三次

要解決:1

選項:使用GROUP_CONCAT(DISTINCT ...)MySQL docs

在MySQL,可以得到表達的連接值組合。要消除重複值,請使用DISTINCT子句。

選項2:使用UNION ALL +派生表

SELECT 
    Student, MAX(CourseConcat), MAX(SubjectConcat) 
FROM 
    (
    -- 2 separate SELECTs here 
    .. student LEFT JOIN course ... 
    UNION ALL 
    .. student LEFT JOIN subjects... 
    ) T 
GROUP BY 
    Student 

第二個選項可能是雖然更加複雜,因爲你必須中間行與DISTINCT

+0

感謝您的詳細解答。現在理解了兩個不同表上的group_concat是如何工作的。 – 2012-03-07 14:41:52

+0

爲''group_concat +1(不同的...)'提示 – Pellizon 2014-05-26 14:38:18

0

處理之後你更好邏輯,group_concat('subjects.name') as subject_names給你重複的項目,因爲有可能是爲每個學生超過1個對象上,這樣你得到的就subject表中的每個學生記錄重複的記錄,而group_concat('students.name') as student_names(我假設)每個學生有1條記錄。

+0

不是實際..我沒有has_many關係中的任何重複條目。總是有與學生相關的uniq科目和課程。 – 2012-03-07 14:36:47

0

我知道我可能推動這個有點太題外話,但因爲從谷歌搜索答案已經在這裏執導了我好幾遍了,我想和大家分享我的解決方案,對於稍微複雜一點類似的問題。

作爲gbn指出的GROUP_CONCAT(DISTINCT ...)解決方案很好,直到您實際上有多個相等的值或幾乎相等,如

我忽略了查詢中的distinct關鍵字並解決了PHP的問題。如果你只需要區分á和簡單的array_unique就可以做到。

不幸的是,我並不那麼幸運,我也有我需要保持的完全相同的值。考慮group_concat領域展開從數據庫查詢返回的樣本值到數組:

$values = array('Value1','Value1','Value2','Value2','Value2','Value2'); 

現在不知怎麼區分有多少重複你處理。我做了以下內容:

$x=0; 
$first = reset($values); 
while($first === $values[$x]) $x++; 

上述方案僅適用,如果你的實際的第一和第二個值是永遠不會相同,這在我的情況是真實的。如果情況並非如此,請找出其他方法來了解您處理的重複數量。 取模的幫助下終於正好被清除所有多餘的值:

foreach($values as $k => $v){ 
     if($k%$x !== 0) unset($values[$k]); 
} 

完蛋了。打印$值現在會給你:

Array 
(
    [0] => Value1 
    [2] => Value2 
    [4] => Value2 
) 
相關問題