2017-03-18 3 views
0

私の必要とするものを返すようにMySQLクエリを終了するにはいくつかの問題があります。私はMYSQLでこのような長いクエリに慣れていません。サブクエリ内のGROUP_CONCATは1行だけを返します

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つの言語の関係がある。私はそれらのそれぞれに2つのサブテーブルを照会する必要がありますが、そのうちの1つはlang_data_id(= lang_rel_a_idまたはlang_rel_b_id、= synt_df_lang_data)と複数の値が可能な異なる言語関数のテキストの間の関係を含むリレーションテーブルです。

このサブクエリのgroup_concatが1つの行だけを返す理由はわかりません。このクエリだけを行うと、すべての結果が得られます。しかし、私はこの大きなクエリに入れて、すべてがうまくいくが、これは..ないです。

マイ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は、id + textの単純な2列テーブルです。

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を使用するため、これは問題ですか?

あらかじめご了承ください。

+0

:-)必要だった正確に何で、どのような代わりに望ましい出力があったはずです。フィドルは完璧です。 – trincot

答えて

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 

たぶん少し長いが、出力は、あなたがそのデータの取得、それらのテーブルやクエリ出力のためのデータを指定することができればそれが役立つだろう

関連する問題