2014-01-30 98 views
0

我的mysql查詢有問題,因爲它爲分組屬性返回重複值。例如,對於屬性q_id,我收到1_-_-_-_-_1_-_-_-_-_1_-_-_-_-_1_-_-_-_-_1_-_-_-_-_1_-_-_-_-_1_-_-_-_-_1_-_-_-_-_2_-_-_-_-_2_-_-_-_-_2_-_-_-_-_2_-_-_-_-_2_-_-_-_-_2_-_-_-_-_2_-_-_-_-_2_-_-_-_-_1_-_-_-_-_1_-_-_-_-_1_-_-_-_-_1_-_-_-_-_1_-_-_-_-_1_-_-_-_-_1_-_-_-_-_1_-_-_-_-_2_-_-_-_-_2_-_-_-_-_2_-_-_-_-_2_-_-_-_-_2_-_-_-_-_2_-_-_-_-_2_-_-_-_-_2而不是1_-_-_-_-_2,如預期的那樣。有兩件事令人困惑。MySQL GROUP_CONCAT重複條目

  1. 1和2重複8次。這可能是因爲有8個不同的keywordspublication相關聯。
  2. 1和2的重複發生2次。這是由於與publication相關聯的2個不同authors

我的查詢。

SELECT 
    sm_publications.id AS p_id, 
    GROUP_CONCAT(sm_authors.last_name SEPARATOR '_-_-_-_-_') AS a_name, 
    GROUP_CONCAT(sm_affiliations.display_name SEPARATOR '_-_-_-_-_') AS af_display_name, 
    GROUP_CONCAT(sm_keywords.name SEPARATOR '_-_-_-_-_') AS k_name, 
    GROUP_CONCAT(sm_query_publications.query_id SEPARATOR '_-_-_-_-_') AS q_id 
FROM sm_publications 
INNER JOIN sm_publication_authors ON sm_publication_authors.publication_id = sm_publications.id 
INNER JOIN sm_authors ON sm_authors.id = sm_publication_authors.author_id 
LEFT JOIN sm_affiliations ON sm_affiliations.id = sm_authors.affiliation_id 
LEFT JOIN sm_publication_keywords ON sm_publication_keywords.publication_id = sm_publications.id 
LEFT JOIN sm_keywords ON sm_keywords.id = sm_publication_keywords.keyword_id 
INNER JOIN sm_query_publications ON sm_query_publications.publication_id = sm_publications.id 
WHERE sm_publications.id IN (1,2) /* Just as example */ 
GROUP BY sm_publications.id 

這些關係可以在以下ERM中看到。 enter image description here

有幾個特點。

  1. 一個publication必須有authors,但keywords不是強制性的。
  2. 一個author可以有一個affiliation,但它不是強制性的。
  3. 一個publication必須指代一個或多個queries

問題:如何在不接收重複屬性的情況下連接所有實體?我知道,有類似GROUP_CONCAT(DISTINCT [...]),但它會導致問題,如果有兩個authors從相同的affiliation,我只能得到一個affiliation回來。但在這種情況下,我想同時收到affiliations,儘管它們是相同的。


輸出示例如下所示。

[ 
{ 
    "p_id": 1, 
    "a_name": 
    "Wang_-_-_-_-_Wang_-_-_-_-_Wang_-_-_-_-_Wang_-_-_-_-_Wang_-_-_-_-_Wang_-_-_-_-_Wang_-_-_-_-_Wang_-_-_-_-_Wang_-_-_-_-_Wang_-_-_-_-_Wang_-_-_-_-_Wang_-_-_-_-_Wang_-_-_-_-_Wang_-_-_-_-_Wang_-_-_-_-_Wang_-_-_-_-_Chen_-_-_-_-_Chen_-_-_-_-_Chen_-_-_-_-_Chen_-_-_-_-_Chen_-_-_-_-_Chen_-_-_-_-_Chen_-_-_-_-_Chen_-_-_-_-_Chen_-_-_-_-_Chen_-_-_-_-_Chen_-_-_-_-_Chen_-_-_-_-_Chen_-_-_-_-_Chen_-_-_-_-_Chen_-_-_-_-_Chen", 
    "af_display_name": "North China Electric Power University_-_-_-_-_North China Electric Power University_-_-_-_-_North China Electric Power University_-_-_-_-_North China Electric Power University_-_-_-_-_North China Electric Power University_-_-_-_-_North China Electric Power University_-_-_-_-_North China Electric Power University_-_-_-_-_North China Electric Power University_-_-_-_-_North China Electric Power University_-_-_-_-_North China Electric Power University_-_-_-_-_North China Electric Power University_-_-_-_-_North China Electric Power University_-_-_-_-_North China Electric Power University_-_-_-_-_North China Electric Power University_-_-_-_-_North China Electric Power University_-_-_-_-_North China Electric Power University_-_-_-_-_Huazhong University of Science & Technology_-_-_-_-_Huazhong University of Science & Technology_-_-_-_-_Huazhong University of Science & Technology_-_-_-_-_Huazhong University of Science & Technology_-_-_-_-_Huazhong University of Science & Technology_-_-_-_-_Huazhong University of Scien", 
    "k_name": "Genetic Algorithm_-_-_-_-_High Efficiency_-_-_-_-_Improved Genetic Algorithm_-_-_-_-_Rule Extraction_-_-_-_-_Data Mining_-_-_-_-_Explicit Knowledge_-_-_-_-_Artificial Neural Network_-_-_-_-_Neural Network_-_-_-_-_Genetic Algorithm_-_-_-_-_High Efficiency_-_-_-_-_Improved Genetic Algorithm_-_-_-_-_Rule Extraction_-_-_-_-_Data Mining_-_-_-_-_Explicit Knowledge_-_-_-_-_Artificial Neural Network_-_-_-_-_Neural Network_-_-_-_-_Genetic Algorithm_-_-_-_-_High Efficiency_-_-_-_-_Improved Genetic Algorithm_-_-_-_-_Rule Extraction_-_-_-_-_Data Mining_-_-_-_-_Explicit Knowledge_-_-_-_-_Artificial Neural Network_-_-_-_-_Neural Network_-_-_-_-_Genetic Algorithm_-_-_-_-_High Efficiency_-_-_-_-_Improved Genetic Algorithm_-_-_-_-_Rule Extraction_-_-_-_-_Data Mining_-_-_-_-_Explicit Knowledge_-_-_-_-_Artificial Neural Network_-_-_-_-_Neural Network" 
    "q_id": "1_-_-_-_-_1_-_-_-_-_1_-_-_-_-_1_-_-_-_-_1_-_-_-_-_1_-_-_-_-_1_-_-_-_-_1_-_-_-_-_2_-_-_-_-_2_-_-_-_-_2_-_-_-_-_2_-_-_-_-_2_-_-_-_-_2_-_-_-_-_2_-_-_-_-_2_-_-_-_-_1_-_-_-_-_1_-_-_-_-_1_-_-_-_-_1_-_-_-_-_1_-_-_-_-_1_-_-_-_-_1_-_-_-_-_1_-_-_-_-_2_-_-_-_-_2_-_-_-_-_2_-_-_-_-_2_-_-_-_-_2_-_-_-_-_2_-_-_-_-_2_-_-_-_-_2" 
}, 
{ 
    "p_id": 2, 
    "a_name": "Mihai_-_-_-_-_Mihai_-_-_-_-_Mihai_-_-_-_-_Mihai_-_-_-_-_Mihai_-_-_-_-_Mihai_-_-_-_-_Mihai_-_-_-_-_Mihai_-_-_-_-_Mihai_-_-_-_-_Mihai_-_-_-_-_Mihai_-_-_-_-_Mihai_-_-_-_-_Mihai_-_-_-_-_Mihai_-_-_-_-_Mihai_-_-_-_-_Mihai", 
    "af_display_name": "University of Pitesti_-_-_-_-_University of Pitesti_-_-_-_-_University of Pitesti_-_-_-_-_University of Pitesti_-_-_-_-_University of Pitesti_-_-_-_-_University of Pitesti_-_-_-_-_University of Pitesti_-_-_-_-_University of Pitesti_-_-_-_-_University of Pitesti_-_-_-_-_University of Pitesti_-_-_-_-_University of Pitesti_-_-_-_-_University of Pitesti_-_-_-_-_University of Pitesti_-_-_-_-_University of Pitesti_-_-_-_-_University of Pitesti_-_-_-_-_University of Pitesti", 
    "k_name": "Web Content Mining_-_-_-_-_Web Structure Mining_-_-_-_-_Web Mining_-_-_-_-_E Commerce_-_-_-_-_Data Preprocessing_-_-_-_-_Cause Related Marketing_-_-_-_-_Web Usage Mining_-_-_-_-_Data Mining_-_-_-_-_Web Content Mining_-_-_-_-_Web Structure Mining_-_-_-_-_Web Mining_-_-_-_-_E Commerce_-_-_-_-_Data Preprocessing_-_-_-_-_Cause Related Marketing_-_-_-_-_Web Usage Mining_-_-_-_-_Data Mining", 
    "q_id": "1_-_-_-_-_1_-_-_-_-_1_-_-_-_-_1_-_-_-_-_1_-_-_-_-_1_-_-_-_-_1_-_-_-_-_1_-_-_-_-_2_-_-_-_-_2_-_-_-_-_2_-_-_-_-_2_-_-_-_-_2_-_-_-_-_2_-_-_-_-_2_-_-_-_-_2" 
} 

]

回答

1

如果你能提供一點樣本數據和表聲明將有可能對此進行測試。

但是我認爲你的問題是由於每個連接表上有多個記錄,連接會給你所有可能的組合,導致GROUP_CONCAT數據中出現重複。

加入子查詢可能工作: -

SELECT 
    sm_publications.id AS p_id, 
    author_inf.a_name, 
    affiliations_inf.af_display_name, 
    keyword_inf.k_name, 
    publications_inf.q_id 
FROM sm_publications 
INNER JOIN 
(
    SELECT sm_publication_authors.publication_id, GROUP_CONCAT(sm_authors.last_name SEPARATOR '_-_-_-_-_') AS a_name 
    FROM sm_publication_authors 
    INNER JOIN sm_authors ON sm_authors.id = sm_publication_authors.author_id 
    GROUP BY sm_publication_authors.publication_id 
) author_inf 
ON author_inf.publication_id = sm_publications.id 
LEFT OUTER JOIN 
(
    SELECT sm_publication_authors.publication_id, GROUP_CONCAT(sm_affiliations.display_name SEPARATOR '_-_-_-_-_') AS af_display_name 
    FROM sm_publication_authors 
    INNER JOIN sm_authors ON sm_authors.id = sm_publication_authors.author_id 
    LEFT JOIN sm_affiliations ON sm_affiliations.id = sm_authors.affiliation_id 
    GROUP BY sm_affiliations.publication_id 
) affiliations_inf 
ON affiliations_inf.publication_id = sm_publications.id 
LEFT OUTER JOIN 
(
    SELECT sm_publication_keywords.publication_id, GROUP_CONCAT(sm_keywords.name SEPARATOR '_-_-_-_-_') AS k_name 
    FROM sm_publication_keywords 
    LEFT JOIN sm_keywords ON sm_keywords.id = sm_publication_keywords.keyword_id 
    GROUP BY sm_publication_keywords.publication_id 
) keyword_inf 
ON keyword_inf.publication_id = sm_publications.id 
INNER JOIN 
(
    SELECT sm_query_publications.publication_id, GROUP_CONCAT(sm_query_publications.query_id SEPARATOR '_-_-_-_-_') AS q_id 
    FROM sm_query_publications 
    GROUP BY sm_query_publications.publication_id 
) publications_inf 
ON publications_inf.publication_id = sm_publications.id 
WHERE sm_publications.id IN (1,2) /* Just as example */ 
+0

其實我也想過子查詢 - 但如何表現樣子?因此,據我所知,我可以使用子查詢,但不得不擔心性能不好,或者我必須拆分查詢,以便結果不會相乘。 – Vilius

+0

性能可能是一個問題(儘管它取決於索引等)。拆分查詢可能會導致更糟糕的性能,因爲您仍然在執行相同的子查詢,只是將多個調用的開銷添加到數據庫中。除了使用GROUP_CONCAT連接數據之外,我認爲唯一的方法是使用CONCAT對子字段進行分組。但是這會讓你不得不在調用腳本中重新分割數據。 – Kickstart

+0

通過分解查詢我的意思是我會以這種方式選擇出版物的數據,我最終會有三個查詢。所有查詢都將訪問發佈表,但每個查詢我只會選擇一個n:m-entity(作者或關鍵字或查詢)。但是你提到的第二種方法看起來也很有趣。我會確定地嘗試一下,因爲我現在知道問題所在,我可以接受你的答案。 – Vilius