如何从mysql中的表创建选择动态字段?

时间:2018-08-14 02:40:39

标签: mysql sql join left-join

我在select语句中加入了查询联接,如下所示:

select a.item_number, total_quantity, store, factory
from (
    select item_number, sum(quantity) as "total_quantity"
    from `item_details`
    group by item_number
) `a` 
left join (
    select item_number, sum(quantity) as 'store' 
    from `item_details` where location_code = 'STORE' 
    group by item_number
) `b` on `a`.`item_number` = `b`.`item_number` 
left join (
    select item_number, sum(quantity) as 'factory' 
    from `item_details` 
    where location_code = 'FACTORY' 
    group by item_number
) `c` on `a`.`item_number` = `c`.`item_number` 
order by `item_number` asc

在上面的查询中,如果我使用表item_details和ID,item_no,数量和位置代码字段

如果执行查询,则结果如下:

enter image description here

结果正确。但是在这里我想创建动态的现场商店和工厂。因此,它取自表位置。因为数据位置是动态的。可以添加和删除

所以我的表位置具有字段ID和类似的描述:

enter image description here

item_details表中的字段location_code是位置表中字段id的外键

那么如何从位置表中创建选择动态字段?

注意:

我使用“ select语句中的查询联接”,因为以前没有表位置。现在,我使用表格位置。因为位置表中的数据是动态的。可以添加和删除它。所以我想像上面的表1一样显示它并显示表位置。似乎需要加入表。但是我还是很困惑

2 个答案:

答案 0 :(得分:1)

这未经测试,如果发现错误,请创建一个小提琴。

SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'ifnull(SUM(case when location_code = ''',
      location_code ,
      ''' then quantity end),0) AS `',
      location_code , '`'
    )
  ) INTO @sql
FROM
  item_details;
SET @sql = CONCAT('SELECT item_number,SUM(quantity) as "total_quantity", ', @sql, ' 
                  FROM item_details
                   GROUP BY item_number');

PREPARE stmt FROM @sql;
EXECUTE stmt;

DEALLOCATE PREPARE stmt;

答案 1 :(得分:0)

如果您使用存储过程,那么您的查询将变得易于动态使用。 您可以通过整数或列名来管理动态列名。
将现有查询存储在变量中,并使用If条件连接动态查询  在变量中。最后通过定义的变量执行该语句。

您可以从下面的链接获取参考以执行动态代码。 mysql dynamic query in stored procedure