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