Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 是否有一种方法可以在将两个表连接在一起时重写它们的值,并在需要时添加列?_Mysql - Fatal编程技术网

Mysql 是否有一种方法可以在将两个表连接在一起时重写它们的值,并在需要时添加列?

Mysql 是否有一种方法可以在将两个表连接在一起时重写它们的值,并在需要时添加列?,mysql,Mysql,问题:如何在将两个表连接在一起时覆盖它们的值,并在需要时添加列 逻辑 基于产品id合并两个表。(表1作为基础,表2作为子(从基础继承)) 表2是否有表1中的列? 对 使用表2中的值替代表1中的值 没有 将列添加到合并表中 下面是我正在使用的表的简单结构 基础产品(表1) +----+------------+-----------+-------+ |id |产品| id |名称|价格| +----+------------+-----------+-------+ |1 | p190x4

问题:如何在将两个表连接在一起时覆盖它们的值,并在需要时添加列

逻辑

  • 基于产品id合并两个表。(表1作为基础,表2作为子(从基础继承))
  • 表2是否有表1中的列?
  • 使用表2中的值替代表1中的值
  • 没有
  • 将列添加到合并表中
  • 下面是我正在使用的表的简单结构

    基础产品(表1)

    +----+------------+-----------+-------+ |id |产品| id |名称|价格| +----+------------+-----------+-------+ |1 | p190x4 |产品1 | 50| |2 | px180i |产品2 | 50| |3 | zz9980 |产品3 | 50| |4 | zz9212 |产品4 | 50| |5 | tu8uii |产品5 | 50| +----+------------+-----------+-------+ 子产品(表2)

    +----+------------+-------+----------+ |id |产品| id |价格|位置| +----+------------+-------+----------+ |1 | p190x4 | 34 | NA| |2 | px180i | 17 | RU| |4 | zz9212 | 65 | LA| +----+------------+-------+----------+ 想要的结果

    +----+------------+-----------+-------+----------+ | id | product_id | name | price | location | +----+------------+-----------+-------+----------+ | 1 | p190x4 | Product 1 | 34 | NA | | 2 | px180i | Product 2 | 17 | RU | | 4 | zz9212 | Product 4 | 65 | LA | +----+------------+-----------+-------+----------+ +----+------------+-----------+-------+----------+ |标识|产品|标识|名称|价格|位置| +----+------------+-----------+-------+----------+ |1 | p190x4 |产品1 | 34 | NA| |2 | px180i |产品2 | 17 | RU| |4 | zz9212 |产品4 | 65 | LA| +----+------------+-----------+-------+----------+ 在想要的结果中,你可以看到发生了一些事情

  • 从表1中添加了
    名称
  • 从表2中添加了
    位置
  • price
    列是使用表2(而不是表1)中的值更新的
  • 编辑


    列名是动态的。子产品表需要灵活,我可以轻松添加属性(列)或删除属性(列)。

    使用别名和要输出的限定字段:

    SELECT s.id, p.product_id AS product_id, p.name , s.price AS price , s.location
    FROM product p
    INNER JOIN sub_product s ON (s.product_id = p.product_id)
    

    已更新(
    product\u id
    而不是
    id

    通常,用户只需在选择列表中指定希望检索的列(在名称冲突的情况下,根据需要使用表限定符):

    在电视上看

    如果事先不知道模式,可以从信息模式动态构造所需的SQL。例如,在MySQL中完成整个工作(这不是我的第一选择,但由于您尚未指定开发应用程序所使用的语言或API,因此只需说明一般原则即可):


    请参阅。

    澄清-您可能事先不知道这两个表的表定义?这只是一个普通的联接,我看不出问题所在。@Barmar我可以将这些值联接在一起,但仅仅联接它们的问题是,我无法找出如何用表2的值覆盖表1中的值。它会一直在列的末尾追加数字,因为我只需要它来覆盖该列。通常只需在
    SELECT
    列表中指定要检索的列(在名称冲突的情况下,根据需要使用表限定符)。如果列是动态的,您如何知道哪些应该来自
    产品
    ,哪些应该来自
    子产品
    ?您没有加入正确的列
    p.id
    应该是
    p.product\u id
    @Barmar:谢谢,正在修复。。。我被
    id
    列搞糊涂了。哇,这似乎比我想象的要复杂得多。至少对我来说很复杂。这非常棒,但是经过一些思考,我可能以错误的方式构建数据库。我得回到绘图板上去了。谢谢 +----+------------+-----------+-------+----------+ | id | product_id | name | price | location | +----+------------+-----------+-------+----------+ | 1 | p190x4 | Product 1 | 34 | NA | | 2 | px180i | Product 2 | 17 | RU | | 4 | zz9212 | Product 4 | 65 | LA | +----+------------+-----------+-------+----------+
    SELECT s.id, p.product_id AS product_id, p.name , s.price AS price , s.location
    FROM product p
    INNER JOIN sub_product s ON (s.product_id = p.product_id)
    
    SELECT t1.id, product_id, t1.name, t2.price, t2.location
    FROM   t1 JOIN t2 USING (product_id);
    
    SELECT CONCAT(
      -- the SQL that we are constructing for subsequent execution
      ' SELECT ',GROUP_CONCAT(
                  '`',REPLACE(t,'`','``'),'`.`',REPLACE(c,'`','``'),'`'
                  ORDER BY t, p
                 ),
      ' FROM   t1 JOIN t2 USING (product_id)'
    ) INTO @sql FROM (
      -- the table-qualified column references that we wish to select
      SELECT   MAX(TABLE_NAME)  t,  -- MAX because 't2'>'t1'
               COLUMN_NAME      c,
               ORDINAL_POSITION p
      FROM     INFORMATION_SCHEMA.COLUMNS
      WHERE    TABLE_SCHEMA = DATABASE()
           AND TABLE_NAME IN ('t1','t2')
      GROUP BY COLUMN_NAME
    ) t;
    
    -- prepare the statement for execution
    PREPARE stmt FROM @sql;
    
    -- execute it
    EXECUTE stmt;
    
    -- tidy up
    DEALLOCATE PREPARE stmt;
    SET @sql := NULL;