2012-11-08 15 views
9

お願い、私をロコにさせてはいけません。私はこの一見簡単な仕事のための答えを見つけようと何時間も過ごしました。文字列を列名に動的に変換します。 MySQL

だから我々は二つのテーブルれている:アイテムと注文

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

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

は基本的に、私は次の操作を実行したい:

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

SO、問題がどこ受注から選択TRANSACTION_TYPEによって返される文字列です。 id = 1、列名に変換することはできません。アイデア?ありがとう、兄弟。

+1

そのクエリの実行時に発生するエラーは何ですか? – RocketDonkey

+0

@RocketDonkeyそれは私の文字列 'type_1'(項目の行数で)の番号を返します –

+0

私の悪い - 私の悪い - 使用されるかもしれない何かを投稿しました(もし私が再び誤解されたら、申し訳ありません)。 – RocketDonkey

答えて

0

問題は、あなたがPIVOTに列の値を持つ

ID = 1、列名に変換することができません 注文から選択TRANSACTION_TYPEによって返される文字列ですordersテーブルのtransaction_typeのようなそう:

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 

次に、あなたはそうのような2つのテーブルをJOINすることができます3210

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

this questionの回答をご覧になることをお勧めします。達成しようとしていると思います。簡単に言えば、答えはeval() - esqueの機能をシミュレートするためにプリペアドステートメントを使用することを示唆しています。あなたのケースでは、これは動作する可能性(あなたが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; 

私は仕事で基礎となる力学の専門家の任意の並べ替えであることを主張しませんが、コメントごとに、それは目標を達成するように思われます再びこれは別の答えから採用されていますので、それが機能する場合は+1してください:)

関連する問題