MySQL组\u CONCAT重复条目

MySQL组\u CONCAT重复条目,mysql,join,group-by,Mysql,Join,Group By,我的mysql查询有一个问题,因为它为分组属性返回重复的值。例如对于属性q_idI receive该文主要是一个来自以下以下网站的《《代码>》的一个以下以下以下以下代码的一个以下以下以下两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两

我的mysql查询有一个问题,因为它为分组属性返回重复的值。例如对于属性
q_id
I receive该文主要是一个来自以下以下网站的《《代码>》的一个以下以下以下以下代码的一个以下以下以下两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两这是一个两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两两U--\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
1_------2
如预期。有两件事令人困惑

  • 1和2每重复8次。这可能是因为与
    出版物相关的
    关键字有8个不同的
  • 1和2的重复出现2次。这是由于与
    出版物
    相关的两位不同的
    作者
  • 我的问题

    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中看到。

    有几个特点

  • 一份
    出版物
    必须有
    作者
    ,但
    关键字
    不是强制性的
  • 一个
    作者
    可以有
    附属关系
    ,但这不是强制性的
  • 一个
    出版物
    必须引用一个或多个
    查询
  • 问题:如何在不接收重复属性的情况下加入所有实体?我知道,有一些东西类似于
    GROUP_CONCAT(DISTINCT[…])
    ,但它导致了一个问题,即如果有两个
    作者来自同一
    附属机构,我只能得到一个
    附属机构。但在这种情况下,我希望接收两个
    附属机构
    ,尽管它们是相同的


    示例输出如下所示

    [
    {
        "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"
    }
    

    ]

    如果您可以提供一些示例数据,并且表格声明可以对此进行测试

    然而,我认为您的问题是由于每个联接表上都有多条记录,然后联接会提供所有可能的组合,从而导致组数据中出现重复

    连接子查询可能会起作用:-

    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 */
    

    我实际上已经考虑过子查询,但是性能如何呢?因此,在我看来,我可以使用子查询并不得不担心性能不好,或者我必须拆分查询,以便结果不会成倍增加。性能可能是一个问题(尽管它将取决于索引等)。拆分查询可能会带来更差的性能,因为您仍然要执行相同的子查询,这只会增加对数据库的多个调用的开销。我能想到的唯一其他方法是使用CONCAT将子字段分组,然后再使用group_CONCAT连接数据。但这将使您不得不在调用脚本中再次拆分数据。通过拆分查询,我的意思是,我将以这样的方式选择发布的数据,最终将有三个查询。所有查询都将访问发布表,但每个查询我只选择一个n:m实体(作者或关键字,或查询)。但是你提到的第二种方法看起来也很有趣。我一定会尝试一下,既然我现在知道问题是什么,我可以接受你的答案。