【问题标题】:How to create a Mysql View between 2 tables如何在 2 个表之间创建一个 Mysql 视图
【发布时间】:2014-03-31 19:55:42
【问题描述】:

我想在一个包含数据的表和另一个具有字段必须显示或不显示的标志的表之间创建一个视图。

TABLE_EXAMPLE

+---------+---------+---------+-----------------+
| id      | field_1 | field_2 | field_3         |
+---------+---------+---------+-----------------+
|   1     | test    | 500     | another content |
+---------+---------+---------+-----------------+
|   2     | blah    | 800     | text_lorem      |
+---------+---------+---------+-----------------+
|   3     | hi!     | 100     | lorem_impsum    |
+---------+---------+---------+-----------------+

REFERENCE_TABLE(此表通过table_name、field_name、entry_id与其他表连接,其他字段为show/not_show标志)

+--------------+------------+----------+------+
| table_name   | field_name | entry_id | show |
+--------------+------------+----------+------+
| TABLE_EXAMPLE| field_1    | 1        |  0   |
+--------------+------------+----------+------+
| TABLE_EXAMPLE| field_2    | 1        |  1   |
+--------------+------------+----------+------+
| TABLE_EXAMPLE| field_3    | 1        |  0   |
+--------------+------------+----------+------+
| TABLE_EXAMPLE| field_1    | 2        |  1   |
+--------------+------------+----------+------+
| TABLE_EXAMPLE| field_2    | 2        |  0   |
+--------------+------------+----------+------+
| TABLE_EXAMPLE| field_3    | 2        |  1   |
+--------------+------------+----------+------+
| TABLE_EXAMPLE| field_1    | 3        |  1   |
+--------------+------------+----------+------+
| TABLE_EXAMPLE| field_2    | 3        |  1   |
+--------------+------------+----------+------+
| TABLE_EXAMPLE| field_3    | 3        |  0   |
+--------------+------------+----------+------+

这是结果视图。如果标志为 0,则字段内容必须为 NULL

RESULT_TABLE

+---------+---------+---------+-----------------+
| id      | field_1 | field_2 | field_3         |
+---------+---------+---------+-----------------+
|   1     | NULL    | 500     | NULL            |
+---------+---------+---------+-----------------+
|   2     | blah    | NULL    | text_lorem      |
+---------+---------+---------+-----------------+
|   3     | hi!     | 100     | NULL            |
+---------+---------+---------+-----------------+

有什么想法或建议吗?没看懂。

【问题讨论】:

    标签: mysql sql view relation


    【解决方案1】:

    如果REFERENCE_TABLE 具有每个实体的所有字段的标志,那么您可以使用这个:

    SELECT
      T1.ID,
      MAX(CASE WHEN T2.field_name = 'field_1' AND T2.show = 1 THEN T1.field_1 END) field_1,
      MAX(CASE WHEN T2.field_name = 'field_2' AND T2.show = 1 THEN T1.field_2 END) field_2,
      MAX(CASE WHEN T2.field_name = 'field_3' AND T2.show = 1 THEN T1.field_3 END) field_3,
    FROM TABLE_EXAMPLE T1
      JOIN REFERENCE_TABLE T2
        ON T1.id = T2.entity_id
    WHERE T2.table_name = 'TABLE_EXAMPLE'
    GROUP BY T1.ID
    

    如果省略一些标志,则使用LEFT JOIN。那么省略的标志将被视为0。

    【讨论】:

    • 谢谢! @Hamlet_Hakobyan
    【解决方案2】:

    这是一种方法,您可以三次加入表,然后使用 case 语句来确定每列的值:

    select e.id,
           (case when r1.show then e.field_1 end) as field_1,
           (case when r2.show then e.field_2 end) as field_2
           (case when r3.show then e.field_3 end) as field_3
    from table_example e left join
         reference_table r1
         on r1.table_name = 'table_name' and r1.entry_id = e.id and r1.column_name = 'field_1' left join      
         reference_table r2
         on r2.table_name = 'table_name' and r2.entry_id = e.id and r2.column_name = 'field_2 left join     
         reference_table r3
         on r3.table_name = 'table_name' and r3.entry_id = e.id and r3.column_name = 'field_3';
    

    【讨论】:

      【解决方案3】:

      您可以使用其他答案中列出的SELECT -statements 来创建视图,如下所示:

      CREATE VIEW v1 AS 
      select id, if(f1.shw=1,field_1,null) field_1, if(f2.shw=1,field_2,null) field_2,     if(f3.shw=1,field_3,null) field_3
       from TABLE_EXAMPLE
        left join REFERENCE_TABLE as f1 on (f1.entry_id=TABLE_EXAMPLE.id and f1.field_name="field_1" and f1.table_name='TABLE_EXAMPLE')
        left join REFERENCE_TABLE as f2 on (f2.entry_id=TABLE_EXAMPLE.id and f2.field_name="field_2" and f2.table_name='TABLE_EXAMPLE')
        left join REFERENCE_TABLE as f3 on (f3.entry_id=TABLE_EXAMPLE.id and f3.field_name="field_3" and f3.table_name='TABLE_EXAMPLE');
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-29
        • 1970-01-01
        • 1970-01-01
        • 2022-11-11
        • 2014-11-24
        • 2023-03-25
        相关资源
        最近更新 更多