11

我有两张桌子:itemsorders

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 的订单中选择 transaction_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像这样的两个表:

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 回答