【问题标题】:How to create select dynamic fields from a table in mysql?如何从mysql中的表中创建选择动态字段?
【发布时间】:2019-01-20 19:30:01
【问题描述】:

我在这样的选择语句中有查询连接:

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

从上面的查询中,如果我使用带有字段 id、item_no、数量和 location_code 的表 item_details,就会出现

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

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

所以我有这样的字段 id 和描述的表格位置:

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

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

注意:

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

【问题讨论】:

  • @Barmar 为什么这个问题被标记为重复?这真的对我没有帮助
  • 您询问了有关在 MySQL 中创建动态列的问题。这就是动态支点。
  • @Barma 是的。但似乎我的情况与那个情况有点不同
  • 我重新打开了。你需要更清楚地解释你的问题。显示你想要得到的结果。并尝试自己编写代码,然后我们将帮助您修复它;我们不会从头开始为您编写代码。
  • @Barmar 好的。但似乎我已经更清楚地解释了我的问题。但我会尝试再次更新它

标签: mysql sql join left-join


【解决方案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;

【讨论】:

  • 谢谢。但我真的对剧本感到困惑。你能更详细地解释一下吗?或者为其他更容易的答案提供解决方案。现在我正在努力理解这个过程
  • 我在您的脚本中没有找到select * from locations。如何上场?
  • 我试过你的脚本,没有错误。列total_quantity,结果是正确的。但是列存储和列工厂,结果不正确
  • 我收到了您的回答,因为实际上您的回答已经回答了我的问题。对于转换问题到 laravel 雄辩。那是另一个问题。谢谢
  • SELECT item_number,SUM(CASE WHEN type='sales' THEN wahatever END)as smth,SUM(quantity)
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    • 2012-04-23
    • 2016-04-18
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    • 1970-01-01
    相关资源
    最近更新 更多