2012-11-08 27 views
9

per favore, non lasciarmi andare in loco. Ho passato ore a cercare una risposta per questo compito apparentemente facile.Conversione dinamica della stringa nel nome della colonna. MySQL

Quindi abbiamo due tabelle: voci e gli ordini

items 
-------------- 
id (int) | type_1 (int) | type_2 (int)| 

orders 
-------------- 
id (int) | transaction_type enum ('type_1', 'type_2') 

Fondamentalmente, voglio fare quanto segue:

select (select transaction_type from orders where id=1) from items; 

SO, il problema è che stringa restituita da selezionare TRANSACTION_TYPE Da ordini DOVE id = 1, non può essere convertito nel nome della colonna. Idee? Grazie, fratelli.

+1

Qual è l'errore che ottieni quando esegui quella query? Mi sembra di avere la risposta corretta, ma potrei avere frainteso la domanda :) – RocketDonkey

+0

@RocketDonkey mi restituisce il numero di stringhe 'tipo_1' (per numero di righe negli articoli) –

+0

Gotcha, il mio messaggio errato che potrebbe essere utile (scusa se ho frainteso di nuovo). – RocketDonkey

risposta

0

il problema è che stringa restituita da selezionare TRANSACTION_TYPE da ordini dove id = 1, non può essere convertito in nome della colonna

Bisogna PIVOT i valori della colonna transaction_type della tabella orders come così:

SELECT 
     id, 
     MAX(CASE WHEN transaction_type = 'type_1' THEN 1 END) Type1, 
     MAX(CASE WHEN transaction_tyep = 'type_2' THEN 2 END) type2 
    FROM orders 
    GROUP BY id 

quindi è possibile JOIN le due tabelle in questo modo:

SELECT i.id - what do you want to select 
FROM items i 
INNER JOIN 
(
    SELECT 
     id, 
     MAX(CASE WHEN transaction_type = 'type_1' THEN 1 END) Type1, 
     MAX(CASE WHEN transaction_tyep = 'type_2' THEN 2 END) type2 
    FROM orders 
    GROUP BY id 
) o ON i.type_1 = o.type1 AND i.type_2 = o.type2 -- you can add more conditions 
6

Si potrebbe voler vedere la risposta a this question, che credo sia quello che stai cercando di realizzare. In breve, la risposta suggerisce di utilizzare istruzioni preparate per simulare una funzionalità eval(). Nel tuo caso, questo può funzionare (si può vedere lo SQLFiddle here:

SELECT transaction_type FROM orders WHERE id=1 into @colname; 
SET @table = 'items'; 
SET @query = CONCAT('SELECT ',@colname,' FROM ', @table); 

PREPARE stmt FROM @query; 
EXECUTE stmt; 

io non pretendo di essere qualsiasi tipo di esperto di meccanica di base al lavoro, ma per i commenti che sembra per raggiungere l'obiettivo Ancora una volta, questo è stato adottato da un'altra risposta, quindi se funziona, assicurati di fare +1 su quello :)

Problemi correlati