2015-01-12 58 views
0

我有2个表格。一位名为购买在子查询中动态设置列名称

(ID,一个月,购买,STOREID)

另一种叫purchases_targets

(ID,STOREID,目标1,TARGET2, target3,target4,target5,target6,target7,target8,target9,target10,target11,target12)

purchases_targets中的列名称与月份相对应,即月份1 = target1的目标。 正常化这不是我的选择! 我想要做的是类似于以下内容。

SELECT DISTINCT 

    purchases.month, 
    purchases.purchase, 
    CONCAT('target',purchases.month) AS column_name, 
    (SELECT 
     column_name 
    FROM purchases_targets 
    WHERE storeid = 1) AS 'target' 

FROM purchases 
WHERE purchases.storeid = 1 

注意使用上述列名的。我试过这个,结果总是返回目标列的目标+月份。我想知道是否有一种方法可以使这个工作在MySQL中。让我知道是否需要更多信息。谢谢

+0

你需要使用动态SQL与'PREPARE',你不能在一个普通的查询计算列名。 – Barmar

+0

我已经看过你在说什么的例子,但是它们都不属于子查询。我如何在我的情况下使用PREPARE方法。 – castle

+0

这似乎是一个设计不佳的模式。为什么不有一个月份列的值为1到12? – Barmar

回答

1

可以使用CASE表达拿起不同的列取决于month

SELECT DISTINCT 
    p.month, 
    p.purchase, 
    CASE p.month 
     WHEN 1 THEN pt.target1 
     WHEN 2 THEN pt.target2 
     ... 
     WHEN 12 THEN pt.target12 
    END AS target 
FROM purchases AS p 
JOIN purchases_targets AS pt ON p.storeid = pt.storeid 
WHERE p.storeid = 1 
+0

感谢您的快速响应。这工作完美 – castle