2012-11-08 18 views
9

lütfen, beni loco'ya bırakma. Bu görünüşte kolay bir iş için bir cevap bulmaya çalışırken saatler geçirdim.Dizenin sütun adına dinamik dönüşümü. MySQL

yüzden iki tablo var:

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

SO, sorun emir yerden seçme transaction_type tarafından döndürülen o dizesidir: öğeleri ve siparişler Temelde

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

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

, şu yapmak istiyorum Kimlik = 1, sütun adına dönüştürülemez. Fikirler? Sağol kardeşler.

+1

Bu sorguyu çalıştırırken aldığınız hata nedir? Ben doğru cevabı almak gibi görünüyor, ama ben soru yanlış anlaşılır olabilir :) – RocketDonkey

+0

@RocketDonkey bana 'type_1' dizeleri sayısını döndürür (öğelerin satır sayısı ile) –

+0

Gotcha, benim kötü - kullanım olabilir bir şey gönderildi (Tekrar yanlış anladım eğer üzgünüm). – RocketDonkey

cevap

0

sorun Sen PIVOT için sütunun değerlerine sahip

id = 1 sütun adının dönüştürülebilir olamaz siparişler seçin transaction_type tarafından döndürülen olduğunu dize orders tablonun transaction_type gibi böylece:

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 

Sonra şöyle iki tablo JOIN edebilirsiniz:

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

Yanıtı, başarmaya çalıştığınız şey olduğuna inandığım this question cevabını görmek isteyebilirsiniz. Kısaca, cevap bir eval() - esque işlevselliğini simüle etmek için hazırlanmış ifadelerin kullanılmasını önermektedir. Senin durumunda bu işe yarayabilir (eğer SQLFiddle here görebilirsiniz:

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; 

iş yerinde yatan mekaniği üzerinde uzman her çeşit olduğunu iddia olmaz, ancak yorumların başına o hedefe ulaşmak gibi görünüyor Yine, bu başka bir cevaptan kabul edildi, bu yüzden işe yararsa, o bir +1 emin olun :)