2014-03-31 121 views
0

我想在具有数据的表与另一个具有该字段必须显示或不显示标志的表之间创建视图。如何在两个表之间创建一个Mysql视图

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(该表是加入了与由表名,FIELD_NAME,entry_id另一个表,另一个字段是显示/ 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   | 
+---------+---------+---------+-----------------+ 

任何想法或建议?我无法得到它。

回答

0

如果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

+0

谢谢! @Hamlet_Hakobyan – hanskait

0

在这里你加入到表三次,然后用一个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'; 
0

您可以使用在其他的答案中所列的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'); 
相关问题