Salve a tutti,
Premessa (non necessaria ma aiuta a capire il problema
)
Sto realizzando una specie di CMS, e ho deciso di spendere un pò di tempo a riflettere sulla struttura del database...
Premetto che nelle intenzioni questo CMS non deve gestire enormi carichi, l'importante è che sia elegante e ben strutturato.
Tra le caratteristiche richieste c'è quella di dare all'utente la possibilità di avere delle tabelle con colonne variabili... E qui vengono le cose difficili.
Ho scelto ho approccio "alla Magento" (per chi lo conosce), ovvero una tabella con le entità (potrebbero essere ad esempio dei prodotti), una tabella con i nomi degli attributi, ed alcune tabelle che sarebbero il risultato di una relazione molti a molti tra entità ed attributi, una per tipo (per cui integer, float, text, time, più tinyint come boolean e mediumtext come collection, da utilizzare per gli array in PHP con la funzione serialize). Ogni tabella ha un suo trigger che va poi ad aggiornare una tabella con lo storico dei dati...
Ora questo approccio è ottimo dal profilo della separazione ed estendibilità di tutto il sistema, però è più macchinoso da gestire, e cercavo qualche metodo per semplificarlo.
Fine premessa 
Innanzitutto ho creato una vista
Codice PHP:
CREATE VIEW `es_view_entities_attributes` AS
SELECT
`entity_id` AS `entity_id`,
`name` AS `attribute_name`,
`value` AS `attribute_value`,
'boolean' AS `attribute_type`
FROM
`es_attributes_boolean`
INNER JOIN `es_attributes`
ON `es_attributes_boolean`.`attribute_id` = `es_attributes`.`id`
UNION
SELECT
`entity_id` AS `entity_id`,
`name` AS `attribute_name`,
`value` AS `attribute_value`,
'collection' AS `attribute_type`
FROM
`es_attributes_collection`
INNER JOIN `es_attributes`
ON `es_attributes_collection`.`attribute_id` = `es_attributes`.`id`
UNION
SELECT
`entity_id` AS `entity_id`,
`name` AS `attribute_name`,
`value` AS `attribute_value`,
'integer' AS `attribute_type`
FROM
`es_attributes_integer`
INNER JOIN `es_attributes`
ON `es_attributes_integer`.`attribute_id` = `es_attributes`.`id`
UNION
SELECT
`entity_id` AS `entity_id`,
`name` AS `attribute_name`,
`value` AS `attribute_value`,
'real' AS `attribute_type`
FROM
`es_attributes_real`
INNER JOIN `es_attributes`
ON `es_attributes_real`.`attribute_id` = `es_attributes`.`id`
UNION
SELECT
`entity_id` AS `entity_id`,
`name` AS `attribute_name`,
`value` AS `attribute_value`,
'text' AS `attribute_type`
FROM
`es_attributes_text`
INNER JOIN `es_attributes`
ON `es_attributes_text`.`attribute_id` = `es_attributes`.`id`
UNION
SELECT
`entity_id` AS `entity_id`,
`name` AS `attribute_name`,
`value` AS `attribute_value`,
'time' AS `attribute_type`
FROM
`es_attributes_time`
INNER JOIN `es_attributes`
ON `es_attributes_time`.`attribute_id` = `es_attributes`.`id`
;
Che già da sola fa un buon lavoro, ritornandomi qualcosa tipo:
Codice PHP:
entity_id | attribute_name | attribute_value | attribute_type
-------------------------------------------------------------
1 | prezzo | 1.50 | real
1 | quantita | 30 | integer
Ora vorrei qualcosa di più, ovvero portare attribute_name a diventare il nome della colonna, ed attribute_value ad essere il valore... Nel caso di prima diventerebbe qualcosa tipo
Codice PHP:
entity_id | prezzo | quantita
1 | 1.50 | 30
L'intero punto della questione è: è possibile in una select utilizzare il valore di una cella come nome della colonna che si va a selezionare? Se sì, come?
Grazie in anticipo, e chiedo scusa se mi sono dilungato un pò