Frage

I want to create a view between a table that has data and another table that has a flag that the field must show or not.

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 (This table is joined with the other table by table_name, field_name,entry_id. The other field is show/not_show flag)

+--------------+------------+----------+------+
| 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   |
+--------------+------------+----------+------+

Here is the resultant view. In case the flag is 0 the field content must be NULL

RESULT_TABLE

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

Any idea or suggestion? I couldn't get it.

War es hilfreich?

Lösung

If the REFERENCE_TABLE has flags for all fields of each entity, then you can use this:

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

or use LEFT JOIN if you omit some flags. Then the omitted flags will treats as 0.

Andere Tipps

Here is one method where you join to the table three times and then use a case statement to determine what the value is for each column:

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';

You can use the SELECT -statements listed in other answers to create the view as follows:

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');
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top