11

私は2つのテーブルを持っていますitems:orders

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;

したがって、問題は、stringによって返されるselect transaction_type from orders where id=1、列名に変換できないことです。

4

2 に答える 2

11

この質問に対する答えを見たいと思うかもしれません。それはあなたが達成しようとしていることだと私は信じています。つまり、答えは、eval() 風の機能をシミュレートするために準備済みステートメントを使用することを提案しています。あなたの場合、これはうまくいくかもしれません(ここでSQLFiddleを見ることができます:

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してください:)

于 2012-11-08T06:17:41.310 に答える
0

問題は、id=1の注文からselecttransaction_typeによって返される文字列を列名に変換できないことです。

次のように、テーブルPIVOTの列の値を指定する必要が あります。transaction_typeorders

    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

JOIN次に、次のように2つのテーブルを作成できます。

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
于 2012-11-08T05:13:26.173 に答える