Domanda

Ho una tabella che è simile al seguente qui sotto:

       id |        cat |         one_above |        top_level | 
        0    'printers'          'hardware'        'computers'

Voglio essere in grado di scrivere una query, senza utilizzare sindacati , che mi restituirà un set di risultati che traspone colonne di questa tabella in righe. Ciò significa, è che voglio che il risultato sia:

       id |          cat |
        0      'printers'
        0      'hardware'
        0     'computers'

Questo è possibile in MySQL? Non posso scendere fino a livello di applicazione e eseguire questo perché sto alimentando questi in un motore di ricerca che indice in base all'ID. Diversi altri DBMS hanno qualcosa come pivot e UNPIVOT. Gradirei avere una visione a qualcosa che mi manca.

Mahmoud

P.S.

Sto pensando di ri-normalizzazione del database come ultima opzione, dal momento che questo non sarà un compito banale.

Grazie!

È stato utile?

Soluzione

ho ottenuto questo dal libro L'arte di SQL , pagine 284-286:

Diciamo che il nome della tabella è foo.

In primo luogo, creare una tabella denominata pivot:

CREATE Table pivot (
  count int
);

Inserire in quella tabelle tante righe quanti sono i colonne che si desidera di ruotare in foo. Dal momento che si dispone di tre colonne in foo che si desidera ruotare, creare tre righe della tabella pivot:

insert into pivot values (1);
insert into pivot values (2);
insert into pivot values (3);

Ora fare un join cartesiano tra il foo e pivot, utilizzando un CASE per selezionare la colonna corretta in base al conteggio:

SELECT foo.id, Case pivot.count
  When 1 Then cat
  When 2 Then one_above
  When 3 Then top_level
End Case
FROM foo JOIN pivot;

Questo dovrebbe dare ciò che si desidera.

Altri suggerimenti

Dopo un po 'abbastanza estesa scavo mi sono imbattuto su questa pagina che può o non può contenere la vostra risposta. Si tratta di un difficile in MySQL, ma da un punto di vista concettuale che può costruire una query che potrebbe recepire come questo usando descrivere (anche se sarebbe probabilmente eseguire orribilmente). Quindi sono sicuro che possiamo trovare un modo per farlo nel modo giusto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top