2016-07-28 204 views
1

我有3個表:MySQL的GROUP_CONCAT加入

作者

author_id last_name first_name organization 
1   Smith  John   Org A 
2   Smith  Mary   Org A 
3   Doe   John   Org B 
4   Doe   Jane   Org C 
5   Jones  John   Org C 
6   Sarduchi  Guido   Org A 

author__papers

author_id paper_id is_conctact_author 
1   1001  0 
2   1001  0 
3   1001  0 
4   1002  0 
5   1002  0 
6   1001  1 

org_info(這已經過濾的is_contact_author < 1)

paper_id organization idx org_count 
1001  Org A   1  2 
1001  Org B   2  2  
1002  Org C   1  1 

我需要的是一個結果集,看起來像這樣基於上面的樣本數據:

paper_id organization last_names  idx org_count 
1001  org A   Smith, Smith 1  2 
1001  org B   Doe    2  2 
1002  Org C   Doe, Jones  1  1 

我親近有:

select AP.paper_id as paper_id, organization 
    GROUP_CONCAT(last_name SEPARATOR ', '), idx, org_count 
from authors A 
inner join authors__papers AP ON A.author_id = AP.author_id 
inner join org_info O ON O.paper_id = AP.paper_id AND O.organization = A.organization 
where AP.is_contact_author < 1 
group by O.organization, AP.paper_id 
order by paper_id; 

...但最後名字被複制。如果我向GROUP_CONCAT添加一個DISTINCT,那麼即使它是一個不同的人,我也會忽略姓氏相同的值(例如Smith)。

有關如何最好地採取此示例數據並獲得所需輸出而不出現問題的任何想法?

TIA!

+0

一般GROUP BY規則說: 如果指定了GROUP BY子句,SELECT列表中的每個列引用必須標識一個分組列或者是一個set函數的參數。 – jarlh

+0

選擇 –

+0

中ARE所在的組中的列是,但select中有列(idx,org_count),但不在group by中。 (在較新的MySQL版本中無效,在舊版本中出現不可預知的結果。) – jarlh

回答

0

假設我正確理解您的問題,一個選項是將您的查詢移動到子查詢中,將authorid字段與distinct相加,然後將group_concat應用於外部查詢。像這樣的:

select paper_id, organization, GROUP_CONCAT(last_name SEPARATOR ', '), 
     idx, org_count 
from (
    select distinct AP.paper_id as paper_id, organization, a.last_name, a.author_id, 
      idx, org_count 
    from authors A 
     inner join authors__papers AP ON A.author_id = AP.author_id 
     inner join org_info O ON O.paper_id = AP.paper_id AND O.organization = A.organization 
    where AP.is_contact_author < 1 
) t 
group by organization, paper_id 
order by paper_id; 

這樣你仍然可以返回2史密斯例如,但他們會有不同的作者ID。

+0

我仍然得到重複,現在idx值也是傾斜的。 –

+0

@DDurham - 在使用sql小提琴時遇到問題,或者會向您展示一個示例,但這對我有用......先從運行內部查詢開始,查看它是否不會返回正確的結果(在group_concat之前)。如果是這樣,這應該工作。如果沒有,請進一步闡述。 – sgeddes

+0

謝謝,現在玩它,並會讓你知道。我也打算髮表小提琴,但也遇到了問題。 –