sql >> データベース >  >> RDS >> Mysql

2番目のテーブルを1つの行に「フラット化」する必要がある2つのテーブル(1-Mの関係)を結合します

    select s.id,s.name,
    max(case when e.course_id = 55 then complete else null end) as c55,
    max(case when e.course_id = 66 then complete else null end) as c66,
    max(case when e.course_id = 77 then complete else null end) as c77
    from student as s
    left join enrollment as e
    on s.id = e.student_id
    group by s.id
    

    @クリス。ストアドプロシージャを使用すると、列の数を知らなくても動的ピボットテーブルを作成できます。これはリンクです

    http://forum.html.it/forum/showthread.php ?s =&threadid =1456236

    同様の問題に対するイタリアのフォーラムでの私の答えの。背後にあるロジックを理解するのに役立つ完全な例があります。 :)

    編集。 MYSQLDYNAMICVIEWで更新

    これが私の最初のダンプです:

    /*Table structure for table `student` */
    
    drop table if exists `student`;
    
    create table `student` (
      `id` int(10) unsigned not null auto_increment,
      `name` varchar(50) default null,
      primary key (`id`)
    ) engine=myisam;
    
    /*Data for the table `student` */
    
    insert  into `student`(`id`,`name`) values (1,'chris');
    insert  into `student`(`id`,`name`) values (2,'joe');
    insert  into `student`(`id`,`name`) values (3,'jack');
    
    drop table if exists enrollment;
    
    create table `enrollment` (
      `enrollment_id` int(11) auto_increment primary key,
      `student_id` int(11) default null,
      `course_id` int(11) default null,
      `complete` varchar(50) default null
    ) engine=myisam auto_increment=8 default charset=latin1;
    
    /*Data for the table `enrollment` */
    
    insert  into `enrollment`(`enrollment_id`,`student_id`,`course_id`,`complete`) values (1,1,55,'true');
    insert  into `enrollment`(`enrollment_id`,`student_id`,`course_id`,`complete`) values (2,1,66,'true');
    insert  into `enrollment`(`enrollment_id`,`student_id`,`course_id`,`complete`) values (3,1,77,'true');
    insert  into `enrollment`(`enrollment_id`,`student_id`,`course_id`,`complete`) values (4,2,55,'true');
    insert  into `enrollment`(`enrollment_id`,`student_id`,`course_id`,`complete`) values (5,2,66,'false');
    insert  into `enrollment`(`enrollment_id`,`student_id`,`course_id`,`complete`) values (6,3,55,'false');
    insert  into `enrollment`(`enrollment_id`,`student_id`,`course_id`,`complete`) values (7,3,66,'true');
    

    これは動的ビューのストアドプロシージャです:

    delimiter //
    drop procedure if exists dynamic_view//
    create procedure dynamic_view()
    begin
    declare finish int default 0;
    declare cid int;
    declare str varchar(10000) default "select s.id,s.name,";
    declare curs cursor for select course_id from enrollment group by course_id;
    declare continue handler for not found set finish = 1;
    open curs;
    my_loop:loop
    fetch curs into cid;
    if finish = 1 then
    leave my_loop;
    end if;
    set str = concat(str, "max(case when e.course_id = ",cid," then complete else null end) as course_",cid,",");
    end loop;
    close curs;
    set str = substr(str,1,char_length(str)-1);
    set @str = concat(str," from student as s
                left join enrollment as e
                on s.id = e.student_id
                group by s.id");
    prepare stmt from @str;
    execute stmt;
    deallocate prepare stmt;
    -- select str;
    end;//
    delimiter ;
    

    それを呼びましょう

    mysql> call dynamic_view();
    +----+-------+-----------+-----------+-----------+
    | id | name  | course_55 | course_66 | course_77 |
    +----+-------+-----------+-----------+-----------+
    |  1 | chris | true      | true      | true      |
    |  2 | joe   | true      | false     | NULL      |
    |  3 | jack  | false     | true      | NULL      |
    +----+-------+-----------+-----------+-----------+
    3 rows in set (0.00 sec)
    
    Query OK, 0 rows affected (0.05 sec)
    

    次に、2つの異なるコースを持つ他の2つのレコードを挿入します。

    insert  into `enrollment`(`student_id`,`course_id`,`complete`) values (1,88,'true');
    insert  into `enrollment`(`student_id`,`course_id`,`complete`) values (3,99,'true');
    

    手順を思い出します。結果は次のとおりです。

    mysql> call dynamic_view();
    +----+-------+-----------+-----------+-----------+-----------+-----------+
    | id | name  | course_55 | course_66 | course_77 | course_88 | course_99 |
    +----+-------+-----------+-----------+-----------+-----------+-----------+
    |  1 | chris | true      | true      | true      | true      | NULL      |
    |  2 | joe   | true      | false     | NULL      | NULL      | NULL      |
    |  3 | jack  | false     | true      | NULL      | NULL      | true      |
    +----+-------+-----------+-----------+-----------+-----------+-----------+
    3 rows in set (0.00 sec)
    
    Query OK, 0 rows affected (0.02 sec)
    

    それで全部です。 :)




    1. MariaDBでのMID()のしくみ

    2. PostgreSQLでクロスデータベースクエリを実行することは可能ですか?

    3. current_dateがPostgreSQLでどのように機能するか

    4. leopardへのmysqlのインストール:ソケットを介してローカルMySQLサーバーに接続できません