子查询中的GROUP_CONCAT仅返回一行

时间:2017-03-18 07:49:46

标签: mysql subquery group-concat

我有一些麻烦来完成我的Mysql查询以返回我需要的东西。我是MYSQL中长期查询的新手。

SELECT                              
  lang_rel_a_id, 
  lang_rel_b_id, 
  lang_rel_id, 
  tla.text_lang_t AS atext,
  lald.lang_data_lang_id AS laid,
  lald.lang_data_position AS lapp,
  lald.lang_data_font_weight AS lafw,
  lald.lang_data_font_size AS lafs,
  lald.lang_data_font_color AS lafc,
  lald.lang_data_bg_color AS labg,
  lasdf.funca AS lafunc,
  lang_ship,
  lbld.lang_data_lang_id AS lbid, 
  lbld.lang_data_position AS lbpp,
  lbld.lang_data_font_weight AS lbfw,
  lbld.lang_data_font_size AS lbfs,
  lbld.lang_data_font_color AS lbfc,
  lbld.lang_data_bg_color AS lbbg,
  tlb.text_lang_t AS btext,
  lbsdf.funcb AS lbfunc

  FROM lang_relation
      LEFT JOIN 
      (SELECT *, GROUP_CONCAT(text_func_t SEPARATOR ', ') AS funca
         FROM synt_data_func
          LEFT JOIN text_func ON text_func_id = synt_df_func 
        GROUP BY synt_df_lang_data
       )
       lasdf ON lang_rel_a_id = lasdf.synt_df_lang_data

       LEFT JOIN lang_data lald ON lald.lang_data_id = lang_rel_a_id
       LEFT JOIN text_lang tla  ON lald.lang_data_lang_id = tla.text_lang_id  

       LEFT JOIN 
          (SELECT *, GROUP_CONCAT(text_func_t SEPARATOR ', ') AS funcb
           FROM synt_data_func
           LEFT JOIN text_func ON text_func_id = synt_df_func 
           GROUP BY synt_df_lang_data
           )
           lbsdf ON lang_rel_b_id = lbsdf.synt_df_lang_data

       LEFT JOIN lang_data lbld ON lbld.lang_data_id = lang_rel_b_id
       LEFT JOIN text_lang tlb  ON lbld.lang_data_lang_id = tlb.text_lang_id

       WHERE lang_rel_a_id < lang_rel_b_id                              
       GROUP BY lang_rel_id

我的lang_relation表中有两种语言的关系。我需要查询它们中的每一个2个子表,但其中一个是一个关系表,其中包含lang_data_id(= lang_rel_a_id或lang_rel_b_id,= synt_df_lang_data)与不同语言函数的文本之间的关系,其中可能有多个值。

我不明白为什么这个子查询中的group_concat只返回一行。如果我只做这个查询,我会得到所有结果。但是当我把它放到这个更大的查询中时,一切都很好,但是这个......不是。

我的language_relation表

CREATE TABLE `lang_relation` 
(
`lang_rel_id` int(11) NOT NULL,
`lang_rel_a_id` int(11) NOT NULL,
`lang_rel_b_id` int(11) NOT NULL,
`lang_ship` tinyint(1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

已加入的lang_data

 CREATE TABLE `lang_data` (
`lang_data_id` int(11) NOT NULL,
`lang_data_pic_key` int(11) NOT NULL,
`lang_data_position` tinyint(1) NOT NULL,
`lang_data_lang_id` int(11) NOT NULL,
`lang_data_font_weight` tinyint(2) NOT NULL,
`lang_data_font_size` tinyint(2) NOT NULL,
`lang_data_font_color` tinyint(2) NOT NULL,
`lang_data_bg_color` tinyint(2) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

还有synt_data_func。 text_table是一个简单的2列表,其中包含id + text。

CREATE TABLE `synt_data_func` (
  `synt_df_id` int(11) NOT NULL,
  `synt_df_lang_data` int(11) NOT NULL,
  `synt_df_func` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

我尝试了不同的方法。这似乎是我所需要的最接近的那个。我不知道我改变GROUP BY子句的次数,我甚至试图在父SELECT中执行CONCAT_GROUP ..

我甚至想知道这是否可行,因为子查询需要2个不同的ID ..这是问题吗?

提前感谢任何提示。

1 个答案:

答案 0 :(得分:0)

我终于明白了。也许它会帮助有类似问题的人。我改变了我的查询方法。

 SELECT 
    lrel.lang_rel_pic_key,
    lrel.lang_rel_id,
    langdata_a.lascore,
    lasdf.func_a,
    langdata_a.latext,
    lasf.score_astyle,
    SUM(lasf.score_astyle) + (langdata_a.lascore) AS atotal,
    lang_ship,
    langdata_b.lbtext,
    langdata_b.lbscore,
    lbsdf.func_b,
    lbsf.bformat,
    lbsf.score_bstyle,
    SUM(lbsf.score_bstyle) + (langdata_b.lbscore) AS btotal

    FROM lang_relation lrel

    INNER JOIN 
    (
        SELECT DISTINCT
            lald.lang_data_id,
            lafw.field_value AS lafweight,
            lafs.field_value AS lafsize,
            lafc.field_value AS laffc,
            lafbg.field_value AS lafbg,
            lapos.field_value AS laposa,
            tla.text_lang_t AS latext,
            SUM(lafw.field_value)  + (lafs.field_value)  + (lafc.field_value)  + (lafbg.field_value)  + (lapos.field_value) AS lascore
                        FROM lang_data lald 
                            LEFT JOIN text_lang tla     ON lald.lang_data_lang_id = tla.text_lang_id
                             LEFT JOIN `fields` lafw ON lald.lang_data_font_weight = lafw.field_id
                             LEFT JOIN `fields` lafs ON lald.lang_data_font_size = lafs.field_id
                             LEFT JOIN `fields` lafc ON lald.lang_data_font_color = lafc.field_id
                             LEFT JOIN `fields` lafbg ON lald.lang_data_bg_color = lafbg.field_id
                             LEFT JOIN `fields` lapos ON lald.lang_data_position = lapos.field_id
        GROUP BY lald.lang_data_id

    )
    langdata_a  ON langdata_a.lang_data_id = lrel.lang_rel_a_id

    LEFT JOIN 
        (SELECT sdf.synt_df_lang_data, GROUP_CONCAT(latf.text_func_t) AS func_a
                FROM  synt_data_func  sdf
                INNER JOIN text_func latf ON latf.text_func_id = sdf.synt_df_func
                GROUP BY sdf.synt_df_lang_data
        )
    lasdf   ON lasdf.synt_df_lang_data = lrel.lang_rel_a_id 

    LEFT JOIN 
        (
                SELECT  sfb.synt_format_lang_data, 
                            sfb.synt_format_fields_id, 
                            GROUP_CONCAT(sfbf.field_text SEPARATOR ', ') AS aformat,
                            SUM(sfbf.field_value) AS score_astyle
                FROM synt_format sfb
                INNER JOIN `fields` sfbf  ON sfbf.field_id = sfb.synt_format_fields_id
                GROUP BY sfb.synt_format_lang_data
         )
         lasf   ON lasf.synt_format_lang_data = lrel.lang_rel_a_id                


    INNER JOIN 
    (
        SELECT DISTINCT
            lbld.lang_data_id,
            lbfw.field_value AS lbfweight,
            lbfs.field_value AS lbfsize,
            lbfc.field_value AS lbffc,
            lbfbg.field_value AS lbfbg,
            lbpos.field_value AS lbposa,
            tlb.text_lang_t AS lbtext,
            SUM(lbfw.field_value)  + (lbfs.field_value)  + (lbfc.field_value)  + (lbfbg.field_value)  + (lbpos.field_value) AS lbscore
                        FROM lang_data lbld 
                            LEFT JOIN text_lang tlb     ON lbld.lang_data_lang_id = tlb.text_lang_id
                             LEFT JOIN `fields` lbfw ON lbld.lang_data_font_weight = lbfw.field_id
                             LEFT JOIN `fields` lbfs ON lbld.lang_data_font_size = lbfs.field_id
                             LEFT JOIN `fields` lbfc ON lbld.lang_data_font_color = lbfc.field_id
                             LEFT JOIN `fields` lbfbg ON lbld.lang_data_bg_color = lbfbg.field_id
                             LEFT JOIN `fields` lbpos ON lbld.lang_data_position = lbpos.field_id
            GROUP BY lbld.lang_data_id

    )
    langdata_b ON langdata_b.lang_data_id = lrel.lang_rel_b_id


    LEFT JOIN 
        (SELECT sdfb.synt_df_lang_data, GROUP_CONCAT(lbtf.text_func_t) AS func_b
                FROM  synt_data_func  sdfb
                INNER JOIN text_func lbtf ON lbtf.text_func_id = sdfb.synt_df_func
                GROUP BY sdfb.synt_df_lang_data
        )
    lbsdf   ON lbsdf.synt_df_lang_data = lrel.lang_rel_b_id


    LEFT JOIN 
        (
                SELECT  sfb.synt_format_lang_data, 
                            sfb.synt_format_fields_id, 
                            GROUP_CONCAT(sfbf.field_text SEPARATOR ', ') AS bformat,
                            SUM(sfbf.field_value) AS score_bstyle
                FROM synt_format sfb
                    INNER JOIN `fields` sfbf  ON sfbf.field_id = sfb.synt_format_fields_id
                GROUP BY sfb.synt_format_lang_data
         )
         lbsf   ON lbsf.synt_format_lang_data = lrel.lang_rel_b_id



    GROUP BY lrel.lang_rel_id

可能有点长,但输出正是所需要的: - )