

現在Viewテーブルの作成を行っていいます。

下記のようにテーブルデータを結合しているのですが、playerテーブルをhoge2.player1_idがNULLの場合、hoge.player1_idで結合したいと考えております。

[code]

    CREATE VIEW hoge_view AS SELECT
     hoge.id,
     hoge.hoge_id,
     hoge2.game_id,
     games.game_category,
     games.tournament,
     hoge.game_result,
     hoge2.game_result,
     hoge.info,
     hoge2.player0_id,
     hoge2.player1_id,
     hoge2.player2_id,
     player0.status as player0_status,
     player1.status as player1_status,
     player2.status as player2_status,
     player0.name as player0_name,
     player1.name as player1_name,
     player2.name as player2_name,
     player0.first_name as player0_first_name,
     player1.first_name as player1_first_name,
     player2.first_name as player2_first_name,
     player0.team_id as player0_team_id,
     player1.team_id as player1_team_id,
     player2.team_id as player2_team_id,
     games.date
     FROM hoge
     JOIN hoge2
        ON hoge.hoge_id = hoge2.id
     JOIN games
        ON hoge2.game_id = games.id
     JOIN players AS player0
        ON hoge2.player0_id = player0.id
     JOIN players AS player1
        ON hoge2.player1_id = player1.id
     JOIN players AS player2
        ON hoge2.player2_id = player2.id
     JOIN teams AS player1_team
        ON player1_team.id = player1.team_id
     JOIN teams AS player0_team
        ON player0_team.id = player0.team_id
    
[/code]

以下のようにして作成したところViewテーブルの参照が出来なくなってしまいました。  
こちらどのように作成すればよいかご存じでしょうか。  
アドバイスなど頂けると大変助かります。

よろしくお願い致します。

[code]

    JOIN player as player1
        ON (hoge2.player1_id = player.id AND hoge2.player1_id IS NOT NULL)
        OR hoge.player1_id = player.id
    
[/code]


CC BY-SA 4.0
2020-08-03T11:07:33.420
69210
2020-08-09T07:50:14.803
2020-08-09T07:50:14.803
3060
29606
question
mysql sql
Viewテーブル作成時に参照値がNULLの場合別条件で結合を行いたい


> Viewテーブル作成時に参照値がNULLの場合別条件で結合を行いたい

以下の考え方はどうでしょうか？

  1. 主テーブルとジョイン先1を結合する
  2. 主テーブルとジョイン先2を結合する、ただし「主テーブルとジョイン先1を結合するときの列がNULLである」条件を加える
  3. 1)と2)をunionで結ぶ

質問された方のテーブル定義を「結合」の観点で単純化したモデルで試してみました。

【テーブルの定義】

[code]

    MariaDB [work_db]> desc 主テーブル;
    +-------+---------+------+-----+---------+-------+
    | Field | Type    | Null | Key | Default | Extra |
    +-------+---------+------+-----+---------+-------+
    | id    | int(11) | YES  |     | NULL    |       |
    | f1    | int(11) | YES  |     | NULL    |       |
    | f2    | int(11) | YES  |     | NULL    |       |
    +-------+---------+------+-----+---------+-------+
    
[/code]

[code]

    MariaDB [work_db]> desc ジョイン先1;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id    | int(11)     | YES  |     | NULL    |       |
    | note  | varchar(16) | YES  |     | NULL    |       |
    +-------+-------------+------+-----+---------+-------+
    
[/code]

[code]

    MariaDB [work_db]> desc ジョイン先2;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id    | int(11)     | YES  |     | NULL    |       |
    | note  | varchar(16) | YES  |     | NULL    |       |
    +-------+-------------+------+-----+---------+-------+
    
[/code]

【テーブルのデータ】

[code]

    MariaDB [work_db]> select * from 主テーブル;
    +------+------+------+
    | id   | f1   | f2   |
    +------+------+------+
    |    1 |    1 |    1 |
    |    2 |    2 | NULL |
    |    3 | NULL |    2 |
    |    4 | NULL | NULL |
    +------+------+------+
    
[/code]

[code]

    MariaDB [work_db]> select * from ジョイン先1;
    +------+-------------------------------+
    | id   | note                          |
    +------+-------------------------------+
    |    1 | ジョイン先1のデータ1          |
    |    2 | ジョイン先1のデータ2          |
    +------+-------------------------------+
    
[/code]

[code]

    MariaDB [work_db]> select * from ジョイン先2;
    +------+-------------------------------+
    | id   | note                          |
    +------+-------------------------------+
    |    1 | ジョイン先2のデータ1          |
    |    2 | ジョイン先2のデータ2          |
    +------+-------------------------------+
    
[/code]

【ビューの定義】

[code]

    MariaDB [work_db]> create view ビュー as
        -> select 主テーブル.id id, 主テーブル.f1 f1, 主テーブル.f2 f2, ジョイン先1.note note from 主テーブル join ジョイン先1 on 主テーブル.f1 = ジョイン先1.id
        -> union
        -> select 主テーブル.id id, 主テーブル.f1 f1, 主テーブル.f2 f2, ジョイン先2.note note from 主テーブル join ジョイン先2 on 主テーブル.f2 = ジョイン先2.id where 主テーブル.f1 is null
        -> ;
    
[/code]

【ビューの検索結果】

[code]

    MariaDB [work_db]> select * from ビュー;
    +------+------+------+-------------------------------+
    | id   | f1   | f2   | note                          |
    +------+------+------+-------------------------------+
    |    1 |    1 |    1 | ジョイン先1のデータ1          |
    |    2 |    2 | NULL | ジョイン先1のデータ2          |
    |    3 | NULL |    2 | ジョイン先2のデータ2          |
    +------+------+------+-------------------------------+
    
[/code]


CC BY-SA 4.0
2020-08-09T07:42:32.243
69387
2020-08-09T07:42:32.243
35558
69210
answer