MySQL GROUP_CONCAT重复条目

时间:2014-01-30 09:19:01

标签: mysql join group-by

我的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。有两件事令人困惑。

  1. 1和2每次重复8次。这可能是因为有{8}个keywordspublication相关联。
  2. 1和2的重复发生2次。这是因为与authors相关联的两个publication
  3. 我的查询。

    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
    4. 问题:如何在不接收重复属性的情况下加入所有实体?我知道,有类似于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 个答案:

答案 0 :(得分: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 */