Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it L'avatar di lloyd27
    Registrato dal
    Mar 2006
    Messaggi
    256

    Stringa come nome colonna in select

    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ò

  2. #2
    OMG

    non ho mai visto una query cosi lunga

    comunque se ho capito bene cosa vuoi fare non lo puoi fare.

    ma se hai scritto una query del genere e vuoi creare quel risultato di basta "lavorare" i risultati di quella query con il php per ottenerli nella forma che vuoi tu

  3. #3
    Utente di HTML.it L'avatar di lloyd27
    Registrato dal
    Mar 2006
    Messaggi
    256
    Alla fine è una query semplice ripetuta per cinque tabelle unite con una union, è soltanto lunga

    Comunque si, quella è la soluzione "di ripiego", solo che se possibile avrei voluto portare quel livello di astrazione dei risultati nel database tramite vista o stored procedure, che teoricamente dovrebbe essere più performante che elaborare i dati con PHP...

    Grazie comunque!

  4. #4
    Originariamente inviato da lloyd27
    Alla fine è una query semplice ripetuta per cinque tabelle unite con una union, è soltanto lunga

    Comunque si, quella è la soluzione "di ripiego", solo che se possibile avrei voluto portare quel livello di astrazione dei risultati nel database tramite vista o stored procedure, che teoricamente dovrebbe essere più performante che elaborare i dati con PHP...

    Grazie comunque!

    hm be... se il database è molto grande IMO è molto meglio avere delle query molto molto semplici e lavorarsi i dati tramite il php..

    io i rallentamenti con siti ad alto traffico ne ho solo tra l'intereazione con il db

  5. #5
    Utente di HTML.it L'avatar di lloyd27
    Registrato dal
    Mar 2006
    Messaggi
    256
    No, il database dovrebbe essere abbastanza limitato come dimensioni, per cui preferirei delegare ad automatismi di mysql ove possibile, per questo cercavo di fare quell'operazione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.