-1

フィードバック テーブルからデータを収集するのに助けが必要です。

私は次のようなテーブルを持っています

tbl_parent_child_details

fld_parent_id   fld_parent_name  fld_child_name   fld_class   fld_section
1               Tom              Ray               8          A
2               Dev              angelina         12          B 

tbl_feedback_children

fld_parent_id  fld_quetion_id   fld_ans 
1              1                1
1              2                3
1              3                2
2              1                4
2              2                5
2              3                2

tbl_feedback_admini

fld_parent_id  fld_quetion_id   fld_ans 
1              1                1
1              2                3
1              3                2
2              1                4
2              2                5
2              3                2

今私の要件は、次のような1行にすべての親のデータが必要なことです:

Parent child q1 q2 q3 q4 q5 q6
tom ray 1 3 2 1 3 2
dev angelina 4 5 2 4 5 2

どんな助けでも大歓迎です。

4

1 に答える 1

0

このタイプの操作は として知られていますが、MySQL にはピボット関数がないため、ステートメントPIVOTで集計関数を使用して複製できます。CASE

クエリは次のようになります。

select pc.fld_parent_name,
  pc.fld_child_name,
  max(case when a.fld_quetion_id = 1 then a.fld_ans end) q1,
  max(case when a.fld_quetion_id = 2 then a.fld_ans end) q2,
  max(case when a.fld_quetion_id = 3 then a.fld_ans end) q3
from tbl_parent_child_details pc
left join tbl_feedback_admini a
  on pc.fld_parent_id = a.fld_parent_id
left join tbl_feedback_children c
  on pc.fld_parent_id = c.fld_parent_id
  and a.fld_quetion_id = c.fld_quetion_id
group by pc.fld_parent_name, pc.fld_child_name

SQL Fiddle with Demoを参照してください。

上記は、変換する質問の数がわかっている場合にうまく機能します。番号が不明な場合は、次のような準備済みステートメントを使用できます。

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(case when a.fld_quetion_id = ''',
      fld_quetion_id,
      ''' then a.fld_ans end) AS q',
      fld_quetion_id
    )
  ) INTO @sql
FROM tbl_feedback_admini;

SET @sql = CONCAT('SELECT pc.fld_parent_name, 
                    pc.fld_child_name, ', @sql, ' 
                  from tbl_parent_child_details pc
                  left join tbl_feedback_admini a
                    on pc.fld_parent_id = a.fld_parent_id
                  left join tbl_feedback_children c
                    on pc.fld_parent_id = c.fld_parent_id
                    and a.fld_quetion_id = c.fld_quetion_id
                  group by pc.fld_parent_name, pc.fld_child_name');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

デモで SQL Fiddle を参照してください

どちらも結果を返します。

| FLD_PARENT_NAME | FLD_CHILD_NAME | Q1 | Q2 | Q3 |
---------------------------------------------------
|             Dev |       angelina |  4 |  5 |  2 |
|             Tom |            Ray |  1 |  3 |  2 |
于 2012-12-16T21:17:53.323 に答える